POJ2676Sudoku

搜索好题,枚举每个位置的数字,没了。。。记得从9,9->1,1不然会T?

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=20;
bool flag=0;
int map[M][M];
char a[M][M];
bool h[M][M],l[M][M],n[M][M];
void coutt()
{
	for (int i=1;i<=9;i++)
	{
		for (int k=1;k<=9;k++)
		cout<<map[i][k];puts("");
	}
	return ;
}
void dfs(int x,int y)
{
	if (flag) return ;
	if (map[x][y]!=0)
	{
		if (x==1&&y==1) return (void)(flag=1);
		else if (y==1) dfs(x-1,9);
		else dfs(x,y-1);
	}
	if (map[x][y]==0)
		for (int i=1;i<=9;i++)
			if (h[x][i]&&l[y][i]&&n[(x-1)/3*3+(y-1)/3+1][i])
			{
				if (flag) return ;
				map[x][y]=i;
				h[x][i]=l[y][i]=n[(x-1)/3*3+(y-1)/3+1][i]=0;
				if (x==1&&y==1) return (void)(flag=1);
				else if (y==1) dfs(x-1,9);
				else dfs(x,y-1);
				if (flag) return ;
				map[x][y]=0;
				h[x][i]=l[y][i]=n[(x-1)/3*3+(y-1)/3+1][i]=1;
			}
	return ;
}
int main()
{
	int t;scanf("%d",&t);
	while (t--)
	{
		memset(map,0,sizeof(map));
		memset(h,1,sizeof(h));
		memset(l,1,sizeof(l));
		memset(n,1,sizeof(n));flag=0;
		for (int i=1;i<=9;i++) scanf("%s",a[i]+1);
		for (int i=1;i<=9;i++)
			for (int k=1;k<=9;k++)
			{
				if (a[i][k]-'0'>0)
				{
					map[i][k]=a[i][k]-'0';
					h[i][map[i][k]]=l[k][map[i][k]]=0;
					n[(i-1)/3*3+(k-1)/3+1][map[i][k]]=0;
				}
			}
		dfs(9,9);if (flag) coutt();else puts("");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/acerandaker/article/details/80933077