标签:img sim code tle als rip otto bottom 免费
传送门:
http://acm.hdu.edu.cn/showproblem.php?pid=1426
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9804 Accepted Submission(s): 2944
#include<iostream> #include<algorithm> #include<stdio.h> #include<queue> #include<set> #include<map> #include<string> #include<memory.h> using namespace std; void putresult(int b[9][9])//输出结果 { for(int i=0; i<9; i++) { for(int j=0; j<9; j++) { if(j!=8) cout<<b[i][j]<<‘ ‘; else cout<<b[i][j]; } cout<<endl; } } void char2int(char a[9][20],int b[9][9])//字符数组转整型数组 { for(int i=0; i<9; i++) { for(int j=0; j<18; j++) { if(a[i][j]==‘?‘) { b[i][j/2]=0; } else if(a[i][j]>=‘1‘&&a[i][j]<=‘9‘) { b[i][j/2]=a[i][j]-‘0‘; } } } } bool judge(int curx,int cury,int num,const int b[9][9]) { int i,j; for(i=0; i<9; i++) //列 if(i!=cury && b[curx][i]==num) return true; for(i=0; i<9; i++) //行 if(i!=curx && b[i][cury]==num) return true; int x,y; x = curx/3*3; y = cury/3*3; for(i=0; i<3; i++) //小九宫格 for(j=0; j<3; j++) if(x+i!=curx && y+j!=cury && b[x+i][y+j]==num) return true; return false; } bool dfs(int b[9][9]) { //找到当前第一个‘?‘位置。如果没有找到,表示所有位置都已填上,即为正确结果,递归结束 int i,j; for(i=0; i<9; i++) for(j=0; j<9; j++) if(b[i][j]==0) //找‘?‘的位置 goto label; label: if(i>=9 && j>=9) //找到正确结果了,递归结束 return true; //记录坐标 int curx = i,cury = j; //确定该位置的可以填的数字 bool temp[10]; //记录哪些数字可以填 int num=0; //记录当前位置可以填的数字的个数 for(i=1; i<=9; i++) if(judge(curx,cury,i,b)) //判断这个位置可不可以放这个数字 temp[i] = false; else { temp[i] = true; num++; } if(num==0) return false; //确定下一个位置 for(i=1; i<=9; i++) if(temp[i]) { //这个数在这个位置可以填 if(judge(curx,cury,i,b)) continue; b[curx][cury] = i; if(dfs(b)) return true; } b[curx][cury] = 0; //回退 return false; } int main() { char a[9][20]; int b[9][9]; int i; for(i=0; i<9; i++) { cin.getline(a[i],20,‘\n‘); } char2int(a,b); if(dfs(b)) { putresult(b); } while(cin.getline(a[0],20,‘\n‘)) { cout<<endl; char a[9][20]; int b[9][9]; int i; for(i=0; i<9; i++) { cin.getline(a[i],20,‘\n‘); } char2int(a,b); if(dfs(b)) { putresult(b); } } return 0; }
HDU 1426 Sudoku Killer(dfs 解数独)
标签:img sim code tle als rip otto bottom 免费
原文地址:https://www.cnblogs.com/yinbiao/p/9356827.html