http://acm.pku.edu.cn/JudgeOnline/problem?id=2918
按行、列和块分别搜索所缺的元素,直到所有元素都填满
#include <iostream>
using namespace std;
#define MAX 9
void Block(int map[MAX][MAX],int cc,int lf,int up,int rt,int dn)
{
int i,j,zc,zi,zj;
bool nine[MAX+1];
cc = zc = 0;
memset(nine,false,sizeof(nine));
for(i = lf;i <= rt;++i)
{
for(j = up;j <= dn;++j)
{
nine[map[i][j]] = true;
if(map[i][j] == 0)
{
zi = i;
zj = j;
++zc;
}
}
}
if(zc == 0)
++cc;
if(zc == 1)
{
for(i = 1;i <= 9 && nine[i];++i);
map[zi][zj] = i;
++cc;
}
}
int main()
{
freopen("in.txt","r",stdin);
char tmp;
int map[MAX][MAX];
int i,j;
int tt,t;
cin >> t;
tt = 1;
bool nine[MAX+1];
int cc,zc,zi,zj;
while(tt <= t)
{
for(i = 0;i < 9;++i)
{
for(j = 0;j < 9;++j)
{
cin >> tmp;
map[i][j] = tmp - '0';
}
}
while(true)
{
cc = 0;
for(i = 0;i < 9;++i)
{
zc = 0;
memset(nine,false,sizeof(nine));
for(j = 0;j < 9;++j)
{
nine[map[i][j]] = true;
if(map[i][j] == 0)
{
zi = i;
zj = j;
++zc;
}
}
if(zc == 0)
++cc;
if(zc == 1)
{
for(j = 1;j <= 9 && nine[j];++j);
map[zi][zj] = j;
++cc;
}
}
if(cc == 9)
break;
cc = 0;
for(i = 0;i < 9;++i)
{
zc = 0;
memset(nine,false,sizeof(nine));
for(j = 0;j < 9;++j)
{
nine[map[j][i]] = true;
if(map[j][i] == 0)
{
zi = i;
zj = j;
++zc;
}
}
if(zc == 0)
++cc;
if(zc == 1)
{
for(j = 1;j <= 9 && nine[j];++j);
map[zj][zi] = j;
++cc;
}
}
if(cc == 9)
break;
cc = 0;
Block(map,cc,0,0,2,2);
Block(map,cc,3,0,5,2);
Block(map,cc,6,0,8,2);
Block(map,cc,0,3,2,5);
Block(map,cc,3,3,5,5);
Block(map,cc,6,3,8,5);
Block(map,cc,0,6,2,8);
Block(map,cc,3,6,5,8);
Block(map,cc,6,6,8,8);
if(cc == 9)
break;
}
printf("Scenario #%d:/n",tt);
for(i = 0;i < 9;++i)
{
for(j = 0;j < 9;++j)
cout << map[i][j];
cout << endl;
}
cout << endl;
++tt;
}
return 0;
}