原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1426
思路:
记录下‘?’的位置,挨个位置从1-9暴搜。
关键在于处理好输入。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<utility>
using namespace std;
typedef pair<int,int>ii;
const int MAXN=10;
int Map[MAXN][MAXN];
ii pos[MAXN*MAXN];
int num;
bool flag=true;
bool boss;
bool check(int n,int k)//检查是否符合条件
{
for(int i=0;i<9;i++)
{
if(k==Map[pos[n].first][i])
return false;
if(k==Map[i][pos[n].second])
return false;
}
int r=pos[n].first/3*3;
int c=pos[n].second/3*3;
for(int i=r;i<r+3;i++)
for(int j=c;j<c+3;j++)
if(Map[i][j]==k)
return false;
return true;
}
void DFS(int n)
{
if(boss)return;//找到便停止
if(n==num)
{
if(flag)
flag=false;
else printf("\n");
for(int i=0;i<9;i++)
{
for(int j=0;j<8;j++)
printf("%d ",Map[i][j]);
printf("%d\n",Map[i][8]);
}
boss=true;
return;
}
for(int i=1;i<=9;i++)
{
if(check(n,i))
{
Map[pos[n].first][pos[n].second]=i;
DFS(n+1);
Map[pos[n].first][pos[n].second]=0;
}
}
return;
}
int main()
{
char s[2];
while(scanf("%s",s)!=EOF)//勿忘EOF
{
num=0;
boss=false;
for(int i=0;i<=8;i++)
{
for(int j=0;j<=8;j++)
{
if(i|j)
scanf("%s",s);
if(s[0]=='?')
{
pos[num].first=i;
pos[num].second=j;
Map[i][j]=0;
num++;
}
else Map[i][j]=s[0]-'0';
}
}
DFS(0);
}
return 0;
}