题意确实简单,题目的要求也不多,只要能符合条件的变可以。
首先看到那个2000ms,这可是决定方法的关键啊,再加上只有9*9的图,所以建议直接采纳DFS,如果有别的方法也可以。
这个题的vis数组有点特别,所以多加考虑点,有行的,有列的,也有小格子的。行列的对应关系简单,我就说说小格子的吧,从左到右,从上到下的顺序排列。
(x,y)点所对应的小格子为 (x-1)/3*3 + (y-1)/3 + 1;小格子是以1开始的。
然后按map左到右,上到下的顺序依次DFS,千万得注意回溯啊。
#include<cstdio>
#include<cstring>
#include<iostream>
#define N 10
using namespace std;
int map[N][N];
char imap[N][N];
bool row[N][N];
bool col[N][N];
bool a[N][N];//小格子
bool DFS(int x,int y)
{
if(x == 10)
return true;
if(map[x][y])
{
bool flag;
if(y == 9)
flag = DFS(x+1,1);
else
flag = DFS(x,y+1);
if(flag)
return true;
else
return false;
}
else
{
for(int i=1; i<=9; ++i)
if(row[x][i]&&col[y][i]&&a[((x-1)/3)*3+(y-1)/3 + 1][i])
{
map[x][y] = i;
row[x][i]=col[y][i]=a[((x-1)/3)*3+(y-1)/3 + 1][i]=false;
bool flag;
if(y == 9)
flag = DFS(x+1,1);
else
flag = DFS(x,y+1);
if(!flag)
{
map[x][y] = 0;
row[x][i]=col[y][i]=a[((x-1)/3)*3+(y-1)/3 + 1][i]=true;
}
else
return true;
}
return false;
}
}
int main()
{
int test;
cin >> test;
while(test--)
{
for(int i=1; i<=9; ++i)
for(int e=1; e<=9; ++e)
{
cin >> imap[i][e];
map[i][e] = imap[i][e]-'0';
}
memset(row,true,sizeof(row));
memset(col,true,sizeof(col));
memset(a,true,sizeof(a));
for(int i=1; i<10; ++i)
for(int e=1; e<10; ++e)
if(map[i][e])
{
row[i][map[i][e]] = false;
col[e][map[i][e]] = false;
int k = ((i-1)/3)*3+(e-1)/3 + 1;
a[k][map[i][e]] = false;
}
DFS(1,1);
for(int i=1; i<=9; ++i)
{
for(int e=1; e<=9; ++e)
cout << map[i][e];
cout <<endl;
}
}
return 0;
}
本文介绍了一个使用深度优先搜索(DFS)算法解决九宫格数独问题的程序实现。通过合理设置行、列及小格子的标记数组,确保了数独解的唯一性和正确性。
122

被折叠的 条评论
为什么被折叠?



