蓝桥 数独

    xiaoxiao2021-03-25  163

    你一定听说过“数独”游戏。 如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。 数独的答案都是唯一的,所以,多个解也称为无解。 本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。 本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。 格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。 输出9行,每行9个数字表示数独的解。 例如: 输入(即图中题目): 005300000 800000020 070010500 400005300 010070006 003200080 060500009 004000030 000009700 程序应该输出: 145327698 839654127 672918543 496185372 218473956 753296481 367542819 984761235 521839764 再例如,输入: 800000000 003600000 070090200 050007000 000045700 000100030 001000068 008500010 090000400 程序应该输出: 812753649 943682175 675491283 154237896 369845721 287169534 521974368 438526917 796318452 资源约定: 峰值内存消耗 < 256M CPU消耗  < 2000ms

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

    #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int mp[15][15]; bool book[15][15]; char s[15]; bool f=false; int check(int x,int y) { if ((x==1 || x==2 || x==3) && (y==1 || y==2 || y==3)) return 1; if ((x==1 || x==2 || x==3) && (y==4 || y==5 || y==6)) return 2; if ((x==1 || x==2 || x==3) && (y==7 || y==8 || y==9)) return 3; if ((x==4 || x==5 || x==6) && (y==1 || y==2 || y==3)) return 4; if ((x==4 || x==5 || x==6) && (y==4 || y==5 || y==6)) return 5; if ((x==4 || x==5 || x==6) && (y==7 || y==8 || y==9)) return 6; if ((x==7 || x==8 || x==9) && (y==1 || y==2 || y==3)) return 7; if ((x==7 || x==8 || x==9) && (y==4 || y==5 || y==6)) return 8; if ((x==7 || x==8 || x==9) && (y==7 || y==8 || y==9)) return 9; } bool pan(int x,int y,int num) { for (int i=1;i<=9;i++) { if (mp[x][i]==num && i!=y) return false; } for (int i=1;i<=9;i++) { if (mp[i][y]==num && i!=x) return false; } return true; } void dfs(int x,int y) { if (f==true) return; if (x==10) { for (int i=1;i<=9;i++) { for (int j=1;j<=9;j++) printf ("%d",mp[i][j]); puts(""); } f=true; return; } if (mp[x][y]==0) { for (int i=1;i<=9;i++) { if (book[check(x,y)][i]==true) continue; if (pan(x,y,i)==true) { mp[x][y]=i; book[check(x,y)][i]=true; dfs(x+(y+1)/10,(y+1)); mp[x][y]=0; book[check(x,y)][i]=false; } } } else dfs(x+(y+1)/10,(y+1)); return; } int main() { memset(book,false,sizeof(book)); for (int i=1;i<=9;i++) { gets(s); for (int j=1;j<=9;j++) { mp[i][j]=s[j-1]-'0'; if (mp[i][j]) book[check(i,j)][mp[i][j]]=true; } } dfs(1,1); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-10429.html

    最新回复(0)