杭电 HOJ 1426 Sudoku Killer 解题报告
数独,才发现可以用回溯做呀,哈哈。代码如下,注意判断文件结束:
#include <iostream> using namespace std; struct point { int x,y; } p[101]; int num,flag,row[10][10],col[10][10],dia[10][10],mat[10][10]; void DFS(int a) { int i,j,x,y,t; if(a==num) { flag=1; return; } x=p[a].x; y=p[a].y; for(i=1;i<=9;i++) if(!row[x][i] && !col[y][i] && !dia[t=(x-1)/3*3+(y-1)/3+1][i]) { row[x][i]=col[y][i]=dia[t][i]=1; mat[x][y]=i; DFS(a+1); if(flag) return; mat[x][y]=0; row[x][i]=col[y][i]=dia[t][i]=0; } } int main() { int i,j,t,first=1; char c; while(cin>>c) { if(first) first=0; else cout<<endl; flag=0; num=1; memset(col,0,sizeof(col)); memset(row,0,sizeof(row)); memset(dia,0,sizeof(dia)); memset(mat,0,sizeof(mat)); for(i=1;i<=9;i++) for(j=1;j<=9;j++) { if(i!=1||j!=1) cin>>c; if(c=='?') { p[num].x=i; p[num++].y=j; } else { t=mat[i][j]=c-'0'; row[i][t]=col[j][t]=dia[(i-1)/3*3+(j-1)/3+1][t]=1; } } DFS(1); for(i=1;i<=9;i++) { for(j=1;j<=8;j++) cout<<mat[i][j]<<' '; cout<<mat[i][j]<<endl; } } }