hdu1426---DFS

来源:互联网 发布:java编程基础培训 编辑:程序博客网 时间:2024/04/29 16:16
//把‘?’提取出来,搜索时检查,这是很暴力的方法,小菜仅会如此;听说还有更高的做法,以后研究了。#include<stdio.h>#include<algorithm>#include<string.h>#include<queue>#define N 11#define M 210using namespace std;int n,m,t,sumf;int map[N][N];char str[2];struct TNode{int x,y;}pt[M];void scan(){int i=1;while(i<81){scanf("%s",str);if(str[0]=='?') map[i/9][i%9]=0,pt[m].x=i/9,pt[m++].y=i%9;else map[i/9][i%9]=str[0]-'0';i++;}}bool isok(int x,int y,int id){int i,j,k,l;for(i=0;i<9;i++){if(map[x][i]==id||map[i][y]==id) return 1;}j=x/3*3,k=y/3*3;for(i=0;i<3;i++) for(l=0;l<3;l++){if(map[j+i][l+k]==id) return 1;}return 0;}bool dfs(int id){int i,j,k,x,y;if(id==m){for(i=0;i<9;i++) {for(j=0;j<9;j++){if(j) printf(" ");printf("%d",map[i][j]);}puts("");}return 1;}for(i=1;i<10;i++){if(isok(pt[id].x,pt[id].y,i)) continue;map[pt[id].x][pt[id].y]=i;if(dfs(id+1)) return 1;map[pt[id].x][pt[id].y]=0;}return 0;}int main(){int cases=0;while(scanf("%s",str)!=EOF){m=0;if(str[0]=='?') map[0][0]=0,pt[m].x=0,pt[m++].y=0;else map[0][0]=str[0]-'0';scan();if(cases++) puts("");dfs(0);}return 0;}


原创粉丝点击