【POJ2676】sudoku 搜索

按照每一行每一列去填数,当填到每一行的第9列时,开始填下一行。

代码如下:

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <memory.h>
#define cls(a,b) memset(a,b,sizeof(a))
using namespace std;

char s[10][10];
int map[10][10],row[10][10],col[10][10],grid[10][10];

inline int get(int x,int y){
	return (x-1)/3*3+(y-1)/3;
}
void init(){
	cls(map,0);cls(row,0);cls(col,0);cls(grid,0);
}

bool dfs(int x,int y){
	if(x==10)return 1;
	else if(map[x][y])return y==9?dfs(x+1,1):dfs(x,y+1);
	else{
		for(int i=1;i<=9;i++){
			if(row[x][i]||col[y][i]||grid[get(x,y)][i])continue;
			row[x][i]=col[y][i]=grid[get(x,y)][i]=1,map[x][y]=i;
			if(y==9?dfs(x+1,1):dfs(x,y+1))return 1;
			row[x][i]=col[y][i]=grid[get(x,y)][i]=map[x][y]=0;
		}
		return 0;
	}
}

int main(){
	int kase;scanf("%d",&kase);
	while(kase--){
		init();
		for(int i=1;i<=9;i++)scanf("%s",s[i]+1);
		for(int i=1;i<=9;i++)
			for(int j=1;j<=9;j++){
				if(s[i][j]=='0')continue;
				map[i][j]=s[i][j]-'0';
				row[i][map[i][j]]=1;
				col[j][map[i][j]]=1;
				grid[get(i,j)][map[i][j]]=1;
			}
		dfs(1,1);
		for(int i=1;i<=9;i++){
			for(int j=1;j<=9;j++)printf("%d",map[i][j]);
			puts("");
		}
	}
	return 0;
}
posted @ 2018-10-01 18:12  shellpicker  阅读(104)  评论(0编辑  收藏  举报