万花丛中一点绿!蒟蒻求调5pts代码
查看原帖
万花丛中一点绿!蒟蒻求调5pts代码
1030876
dhlzzsx楼主2023/12/31 16:10
#include<algorithm>
#include<cstdio>
using namespace std;
struct node{
	int num,x;
}a[10];
int sudoku[10][10],Search[82][4];
int Answer=-1,Count;
bool f1[10][10],f2[10][10],f3[10][10];
bool cmp(node a,node b){
	return a.num<b.num;
}int palace(int x,int y){
	if(x>=1&&x<=3&&y>=1&&y<=3)
		return 1;
	else if(x>=1&&x<=3&&y>=4&&y<=6)
		return 2;
	else if(x>=1&&x<=3&&y>=7&&y<=9)
		return 3;
	else if(x>=4&&x<=6&&y>=1&&y<=3)
		return 4;
	else if(x>=4&&x<=6&&y>=4&&y<=6)
		return 5;
	else if(x>=4&&x<=6&&y>=7&&y<=9)
		return 6;
	else if(x>=7&&x<=9&&y>=1&&y<=3)
		return 7;
	else if(x>=7&&x<=9&&y>=4&&y<=6)
		return 8;
	else
		return 9;
}int score(int x,int y){
	if(x==1||y==1||x==9||y==9)
		return 6;
	else if(x==2||y==2||x==8||y==8)
		return 7;
	else if(x==3||y==3||x==7||y==7)
		return 8;
	else if(x==4||y==4||x==6||y==6)
		return 9;
	else
		return 10;
}void dfs(int dep,int Total){
	if(dep==Count+1){
		if(Total>Answer)
			Answer=Total;
		return;
	}for(int x=1;x<=9;x++)
		if(f1[Search[dep][1]][x]==false&&f2[Search[dep][2]][x]==false&&f3[Search[dep][3]][x]==false){
			f1[Search[dep][1]][x]=f2[Search[dep][2]][x]=f3[Search[dep][3]][x]=true;
			dfs(dep+1,Total+(Search[dep][0]*x));
			f1[Search[dep][1]][x]=f2[Search[dep][2]][x]=f3[Search[dep][3]][x]=false;
		}
}int main(){
	int Total=0;
	for(int i=1;i<=9;i++){
		a[i].x=i;
		for(int j=1;j<=9;j++){
			scanf("%d",&sudoku[i][j]);
			if(sudoku[i][j]){
				f1[i][sudoku[i][j]]=f2[j][sudoku[i][j]]=f3[palace(i,j)][sudoku[i][j]]=true;
				Total+=sudoku[i][j]*score(i,j);
			}else
				a[i].num++;
		}
	}sort(a+1,a+10,cmp);
	for(int i=1;i<=9;i++){
		for(int j=1;j<=9;j++)
			if(sudoku[a[i].x][j]==0){
				Search[++Count][0]=score(i,j);
				Search[Count][1]=a[i].x;
				Search[Count][2]=j;
				Search[Count][3]=palace(i,j);
			}
	}dfs(1,Total);
	printf("%d",Answer);
	return 0;
}

(悬关)

2023/12/31 16:10
加载中...