NC50249. 靶形数独
描述
输入描述
输入一共9行。每行9个整数(每个数都在0—9的范围内),表示一个尚未填满的数独方格,未填的空格用0表示。每两个数字之间用一个空格隔开。
输出描述
输出共1行。
输出可以得到的靶形数独的高分数。如果这个数独无解,则输出整数-1。
示例1
输入:
7 0 0 9 0 0 0 0 1 1 0 0 0 0 5 9 0 0 0 0 0 2 0 0 0 8 0 0 0 5 0 2 0 0 0 3 0 0 0 0 0 0 6 4 8 4 1 3 0 0 0 0 0 0 0 0 7 0 0 2 0 9 0 2 0 1 0 6 0 8 0 4 0 8 0 5 0 4 0 1 2
输出:
2829
示例2
输入:
0 0 0 7 0 2 4 5 3 9 0 0 0 0 8 0 0 0 7 4 0 0 0 5 0 1 0 1 9 5 0 8 0 0 0 0 0 7 0 0 0 0 0 2 5 0 3 0 5 7 9 1 0 8 0 0 0 6 0 1 0 0 0 0 6 0 9 0 0 0 0 1 0 0 0 0 0 0 0 0 6
输出:
2852
C++11(clang++ 3.9) 解法, 执行用时: 470ms, 内存消耗: 488K, 提交时间: 2020-02-26 13:05:05
#include<cstdio> #include<algorithm> using namespace std; int ans=-1,a[10][10],b[10][10],c[10][10]; bool f1[10][10],f2[10][10],f3[10][10]; void dfs(int step) { int i,j,k,s,xx,yy,zz=10; for(i=1;i<=9;i++) for(j=1;j<=9;j++)if(a[i][j]==0) { for(s=0,k=1;k<=9;k++) if(!f1[c[i][j]][k] && !f2[i][k] && !f3[j][k])s++; if(s<zz)zz=s,xx=i,yy=j; } if(zz==10) { for(k=0,i=1;i<=9;i++) for(j=1;j<=9;j++) k+=a[i][j]*b[i][j]; ans=max(ans,k); return; } if(zz==0)return; for(k=1;k<=9;k++) if(!f1[c[xx][yy]][k] && !f2[xx][k] && !f3[yy][k]) { a[xx][yy]=k; f1[c[xx][yy]][k]=f2[xx][k]=f3[yy][k]=1; dfs(step+1); a[xx][yy]=0; f1[c[xx][yy]][k]=f2[xx][k]=f3[yy][k]=0; } } int main() { int i,j,k; for(i=1;i<=9;i++) for(j=1;j<=9;j++) { scanf("%d",&a[i][j]); b[i][j]=10-max(abs(i-5),abs(j-5)); c[i][j]=(i-1)/3*3+(j-1)/3+1; f1[c[i][j]][a[i][j]]=1; f2[i][a[i][j]]=1; f3[j][a[i][j]]=1; } dfs(1); printf("%d\n",ans); return 0; }
C++14(g++5.4) 解法, 执行用时: 577ms, 内存消耗: 488K, 提交时间: 2020-06-21 00:13:06
#include<cstdio> #include<algorithm> using namespace std; int ans=-1,a[10][10],b[10][10],c[10][10]; bool f1[10][10],f2[10][10],f3[10][10]; void dfs(int step) { int i,j,k,s,xx,yy,zz=10; for(i=1; i<=9; i++) for(j=1; j<=9; j++) if(a[i][j]==0) { for(s=0,k=1; k<=9; k++) if(!f1[c[i][j]][k] && !f2[i][k] && !f3[j][k]) s++; if(s<zz){ zz=s; xx=i; yy=j; } } if(zz==10) { for(k=0,i=1; i<=9; i++) for(j=1; j<=9; j++) k+=a[i][j]*b[i][j]; ans=max(ans,k); return; } if(zz==0)return; for(k=1; k<=9; k++) if(!f1[c[xx][yy]][k] && !f2[xx][k] && !f3[yy][k]) { a[xx][yy]=k; f1[c[xx][yy]][k]=f2[xx][k]=f3[yy][k]=1; dfs(step+1); a[xx][yy]=0; f1[c[xx][yy]][k]=f2[xx][k]=f3[yy][k]=0; } } int main() { int i,j,k; for(i=1; i<=9; i++) for(j=1; j<=9; j++) { scanf("%d",&a[i][j]); b[i][j]=10-max(abs(i-5),abs(j-5)); // 分值 c[i][j]=(i-1)/3*3+(j-1)/3+1; // 方块 f1[c[i][j]][a[i][j]]=1; //方块内只能有一个 f2[i][a[i][j]]=1; // 同一行只能有一个 f3[j][a[i][j]]=1; // 同一列只能有一个 } dfs(1); printf("%d\n",ans); return 0; }