您的位置:首页 > 其它

蓝桥杯 数独 深度优先搜索

2016-03-18 23:15 204 查看
题目:

你一定听说过“数独”游戏。

如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。

输出9行,每行9个数字表示数独的解。

例如:

输入(即图中题目):

005300000

800000020

070010500

400005300

010070006

003200080

060500009

004000030

000009700

程序应该输出:

145327698

839654127

672918543

496185372

218473956

753296481

367542819

984761235

521839764

再例如,输入:

800000000

003600000

070090200

050007000

000045700

000100030

001000068

008500010

090000400

程序应该输出:

812753649

943682175

675491283

154237896

369845721

287169534

521974368

438526917

796318452

资源约定:

峰值内存消耗 < 256M

CPU消耗 < 2000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0

注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

#define M 11

struct point
{
int x, y;
} p[100];
//row[i][j]表示第i行是否有数字j,col[i][j]表示第i列是否有数字j,mat[i][j][k]表示第(i,j)位置的小九宫格里是否有数字k
int Map[M][M];
bool flag, row[M][M], col[M][M], mat[3][3][M];
int np;

void DFS(int num)
{
if (flag) return;

int i, j;

if (num == -1)
{
for (i = 0; i < 9 && !flag; i++)
{
for (j = 0; j < 9; j++)
printf ("%d", Map[i][j]);
printf ("\n");
}
flag = true;
return;
}

for (i = 1; i <= 9 && !flag; i++)
{
int x = p[num].x;
int y = p[num].y;
if (!row[x][i] && !col[y][i] && !mat[x/3][y/3][i])
{
row[x][i] = col[y][i] = mat[x/3][y/3][i] = true;
Map[x][y] = i;
DFS(num-1);
row[x][i] = col[y][i] = mat[x/3][y/3][i] = false;
Map[x][y] = 0;
}
}
}

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

//scanf ("%d", &t);
//while (t--)
{
memset (row, false, sizeof (row));
memset (col, false, sizeof (col));
memset (mat, false, sizeof (mat));
np = 0;
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
scanf ("%1d", &Map[i][j]);                      // 新技能
int num = Map[i][j];
if (num)
row[i][num] = col[j][num] = mat[i/3][j/3][num] = true;
else
{
p[np].x = i;
p[np++].y = j;
}
}
}
flag = false;
DFS(np-1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: