5pts求助
查看原帖
5pts求助
729338
xihegudiiakioi楼主2024/4/13 12:56
#include <bits/stdc++.h>
using namespace std;

struct Node{
	int x,y,lin,lis;
};
vector <Node> v;
int a[10][10],n,ans = -1;
bool lne[10][10],lst[10][10],nin[10][10];
bool cmp(Node x,Node y){
	if(x.lin == y.lin && x.x == y.x){
		return x.lis > y.lis;
	}
	if(x.lin == y.lin){
		return x.x > y.x;
	}
	return x.lin > y.lin;
}
int score(){
	int s = 0,x;
	for(int i = 1;i <= 9;i++){
		for(int j = 1;j <= 9;j++){
			if(i == 1 || i == 9 || j == 1 || j == 9){
				x = 6;
			}else if(i == 2 || i == 8 || j == 2 || j == 8){
				x = 7;
			}else if(i == 3 || i == 7 || j == 3 || j == 7){
				x = 8;
			}else if(i == 4 || i == 6 || j == 4 || j == 6){
				x = 9;
			}else{
				x = 10;
			}
			s += x * a[i][j];
		}
	}
    for(int i = 1;i <= 9;i++){
    	for(int j = 1;j <= 9;j++){
    		cout << a[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
	return s;
}
void dfs(int p,int d){
	if(d == n){
		ans = max(ans,score());
		return;
	}
	for(int i = 1;i <= 9;i++){
		int nine = ((v[p].x - 1) / 3 * 3 + (v[p].y - 1) / 3 + 1);
		if(lne[v[p].x][i] || lst[v[p].y][i] || nin[nine][i]){
			continue;
		}
		lne[v[p].x][i] = lst[v[p].y][i] = nin[nine][i] = true;
	    a[v[p].x][v[p].y] = i;
	    dfs(p + 1,d + 1);
	    a[v[p].x][v[p].y] = 0;
	    lne[v[p].x][i] = lst[v[p].y][i] = nin[nine][i] = false;
	}
}
int main(){
	for(int i = 1;i <= 9;i++){
		for(int j = 1;j <= 9;j++){
			cin >> a[i][j];
			if(a[i][j]){
				lne[i][a[i][j]] = true;
				lst[j][a[i][j]] = true;
				nin[(i - 1) / 3 * 3 + (j - 1) / 3 + 1][a[i][j]] = 1;
			}else{
				n++;
			}
		}
	}
//	for(int i = 1;i <= 9;i++){
//		for(int j = 1;j <= 9;j++){
//			cout << nin[i][j] << " ";
//		}
//		cout << endl;
//	}
	for(int i = 1;i <= 9;i++){
		for(int j = 1;j <= 9;j++){
			int h = 0,l = 0;
			if(!a[i][j]){
				for(int k = 1;k <= 9;k++){
					if(lne[i][k]){
						h++;
					}
				}
				for(int k = 1;k <= 9;k++){
					if(lst[j][k]){
						l++;
					}
				}
				v.push_back({i,j,h,l});
			}
		}
	}
	sort(v.begin(),v.end(),cmp);
//	for(int i = 0;i < v.size();i++){
//		cout << v[i].x <<" " << v[i].y <<" " << v[i].lin << " " << v[i].lis << endl;
//	}
	dfs(1,1);
	cout << ans;
	
	return 0;
}

样例1的第9行第3列那个0应该是6,是6就对了,反正每个都差一点。

2024/4/13 12:56
加载中...