标签:
题意:给9乘9的数独矩阵,挖去其中5个元素,要求补全其余元素
所犯错误:1.题目中所给的数独矩阵本身可能就是错的(没认真看题,wa惨了)
2.回溯时,遇到正确的答案就终止循环
#include<stdio.h> #include<string.h> #include<queue> using namespace std; bool flag[3][11][11]; int n,a[11][11],b[7][5],k,ans[7],f; bool valid(){ for(int i=1;i<=9;i++) for(int j=1;j<=9;j++){ for(int z=0;z<3;z++) if(flag[z][i][j]==true){return false;} } return true; } void found(int i){ int j; if(i==6){if(valid())f=true;return;} for(j=1;(j<=9);j++){ if((flag[0][b[i][0]][j])&&(flag[1][b[i][1]][j])&&(flag[2][b[i][2]][j])){ flag[0][b[i][0]][j]=false; flag[1][b[i][1]][j]=false; flag[2][b[i][2]][j]=false; ans[i]=j; found(i+1); if(f)break; flag[0][b[i][0]][j]=true; flag[1][b[i][1]][j]=true; flag[2][b[i][2]][j]=true; } } } void init(){ for(int i=1;i<=9;i++){ for(int z=1;z<=9;z++){ flag[0][i][a[i][z]]=false; flag[1][i][a[z][i]]=false; flag[2][i][a[(i-1)/3*3+1+(z-1)/3][(i-1)%3*3+1+(z-1)%3]]=false; } } } int main(){ scanf("%d",&n); char c; while(n--){ k=0; f=false; memset(flag,true,sizeof(flag)); for(int i=1;i<=9;i++){ getchar(); for(int j=1;j<=9;j++){ scanf("%c",&c); a[i][j]=int(c)-‘0‘; if(a[i][j]==0){ k++; b[k][0]=i; b[k][1]=j; b[k][2]=((i-1)/3)*3+1+(j-1)/3; } } } init(); found(1); if(f){ for(int p=1;p<=5;p++) a[b[p][0]][b[p][1]]=ans[p]; for(int i=1;i<=9;i++){ for(int j=1;j<=9;j++){ printf("%d",a[i][j]); } printf("\n"); } } else printf("Could not complete this grid.\n"); printf("\n"); } return 0; }
Summer Training #10 Div.2 E(暴力+回溯)
标签:
原文地址:http://www.cnblogs.com/fuliujun/p/5698863.html