您的位置:首页 > 其它

POJ 2676 sudoku

2013-08-22 09:27 302 查看
  数独问题。给定其中的几个数,找出其他符合规则的数。保证所给数据合法。典型的DFS。 又是1A真爽。

  首先用三个数组标记每列每行每个九宫格出现过的数字。然后DFS寻找可能的状态。跑了400+ms。

#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

int sudoku[10][10];

bool MarkDfs,hr[10][10],hc[10][10],hs[10][10];

int JudgeS(int i,int j)
{
if(1 <= i && i <= 3 && 1 <= j && j <= 3)
return 1;
if(1 <= i && i <= 3 && 4 <= j && j <= 6)
return 2;
if(1 <= i && i <= 3 && 7 <= j && j <= 9)
return 3;
if(4 <= i && i <= 6 && 1 <= j && j <= 3)
return 4;
if(4 <= i && i <= 6 && 4 <= j && j <= 6)
return 5;
if(4 <= i && i <= 6 && 7 <= j && j <= 9)
return 6;
if(7 <= i && i <= 9 && 1 <= j && j <= 3)
return 7;
if(7 <= i && i <= 9 && 4 <= j && j <= 6)
return 8;
if(7 <= i && i <= 9 && 7 <= j && j <= 9)
return 9;
}

void dfs(int r,int c)
{
if(MarkDfs == false)
return;
int i,j,k;
for(i = r;i <= 9; ++i)
{
for(j = (i == r ? c : 1);j <= 9; ++j)
{
if(sudoku[i][j] == 0)
{
for(k = 1;k <= 9; ++k)
{
if(hr[i][k] == false && hc[j][k] == false && hs[JudgeS(i,j)][k] == false)
{
hr[i][k] = true;
hc[j][k] = true;
hs[JudgeS(i,j)][k] = true;
sudoku[i][j] = k;
dfs(i,j);
if(MarkDfs)
{
sudoku[i][j] = 0;
hr[i][k] = false;
hc[j][k] = false;
hs[JudgeS(i,j)][k] = false;
}
}
}
return ;
}
}
}
MarkDfs = false;
}

int main()
{
int T;
int i,j;

scanf("%d",&T);

while(T--)
{
memset(hr,false,sizeof(hr));
memset(hc,false,sizeof(hc));
memset(hs,false,sizeof(hs));

MarkDfs = true;

for(i = 1;i <= 9; ++i)
{
for(j = 1;j <= 9; ++j)
scanf("%1d",&sudoku[i][j]);
}

for(i = 1; i <= 9; ++i)
{
for(j = 1;j <= 9; ++j)
{
hr[i][sudoku[i][j]] = true;
hc[j][sudoku[i][j]] = true;
hs[JudgeS(i,j)][sudoku[i][j]] = true;
}
}

dfs(1,1);

for(i = 1;i <= 9; ++i)
{
for(j = 1;j <= 9; ++j)
{
printf("%d",sudoku[i][j]);
}
printf("\n");
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: