HDU 1426 Sudoku Killer
很暴力的用深搜.要说有优化的话,只有记录缺数的坐标,从横行缺数最少的一行开始搜.
杭电正举行成都网络赛,可惜学校没报名参加,队友也没有..唉.想起就伤心,只能自己刷题玩了.
#include <iostream> using namespace std; char map[9][9]; int n; struct Node { int x,y; }; Node L[81]; bool islegal(int x,int y,char num) { int i; for( i=x/3*3;i<x/3*3+3;i++) //判断九宫是否重复 { for(int j=y/3*3;j<y/3*3+3;j++) { if(map[i][j] == num) return false; } } for( i=0;i<9;i++) //判断横竖是否重复 { if(map[x][i] == num || map[i][y] == num) return false; } return true; } bool suc ; void dfs(int t) { int i,j; if(suc) return; if(t == n) { for(i=0;i<9;i++) { printf("%c",map[i][0]); for(j=1;j<9;j++) { printf(" %c",map[i][j]); } printf("\n"); suc = true; } return; } for(j=1;j<=9;j++) { if(islegal(L[t].x,L[t].y,j + '0')) //若无重复 { map[L[t].x][L[t].y] = j + '0'; //标记 dfs( t + 1); if(suc) return; map[L[t].x][L[t].y] = '?'; //恢复 } } } int main(int argc, const char *argv[]) { // freopen("input.txt","r",stdin); int s = 0; char ch[2]; while(~scanf("%s",ch)) //输入处理可用字符串 { n = 0; int i,j,k; map[0][0] = ch[0]; memset(L,0,sizeof(L)); for(i=0;i<9;i++) { bool vis[9]; memset(vis,0,sizeof(vis)); for(j=0;j<9;j++) { if((i+j)!=0) { scanf("%s",ch); map[i][j] = ch[0]; } if(map[i][j] != '?') { char c = ch[0]; vis[c - '0' - 1] = 1; }else { L[n].x = i; L[n].y = j; n++; } } } suc = false; if(s) cout<<endl; s++; dfs(0); } return 0; }