C语言——求解数独(深搜)
2017-11-14 08:20
246 查看
数独游戏
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
输入:
一个9*9的矩阵,0表示该位置是空白。
输出:
一个9*9的矩阵,格式与输入类似。
输入样例:
900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
输出样例:
971453268
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854
答案如下:
#include<stdio.h>
char shudu[9][9];
int a[9][9];
int m;
void search(int m);
void output();
int canplace(int m,int n);
int main()
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
scanf("%c",&shudu[i][j]);
a[i][j]=shudu[i][j]-'0';
}
if(i!=8) scanf("\n");
}
search(0);
}
void search(int m)
{
int i;
if(m==81)
{
output();
}
else if(a[m/9][m%9]!=0)
{
search(m+1);
}
else if(a[m/9][m%9]==0)
{
for(i=1;i<=9;i++)
{
if(canplace(m,i))//尽管m是全局变量,仍需传到canplace里
{
a[m/9][m%9]=i;
search(m+1);
a[m/9][m%9]=0;
}
}
}
}
int canplace(int m,int n)
{
//一个函数不能有多处返回值。。真是蠢哭了
int k,j,flag=1;
for(j=0;j<9;j++)
{
if(n==a[m/9][j])
{
flag=0;
break;
}
}
if(flag==1)
{
for(j=0;j<9;j++)
{
if(n==a[j][m%9])
{
flag=0;
break;
}
}
}
if(flag==1)
{
for(j=((m/9)/3)*3;j<((m/9)/3)*3+3;j++)
{
for(k=((m%9)/3)*3;k<((m%9)/3)*3+3;k++)
{
if(n==a[j][k])
{
flag=0;
break;
}
}
if(flag==0) break;
}
}
return(flag);
}
void output()
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
}
相关文章推荐
- c语言编写求解数独
- 简单数独求解算法(C语言)
- C语言求解数独
- 数独 递归求解(C语言)
- 递增有序的顺序表表示集合,求解两个集合的交集 并集 差集(c语言实现)
- C语言迷宫求解
- 关于如何求解数独问题
- 求解最完成量以及任务序列C语言
- 规则数独的计算机求解(POJ - 3074 Sudoku)
- C语言求解欧拉错位排列
- 数独 问题求解
- 使用C语言实现最小生成树求解的简单方法
- 数独游戏求解(递归+回溯)
- 用C求解一元二次方程的解,遇到的问题及解决办法 分类: C语言 2012-03-13 00:26 3094人阅读 评论(0) 收藏
- 史上最难数独求解,用时约5秒,回溯法,deepcopy是关键
- 用C语言实现“百鸡问题”的求解
- C语言实现的数独解题程序
- POJ 2918 求解数独
- 第二周《C语言及程序设计》实践项目35 问题求解方法——迭代
- 使用深度优先搜索算法来求解迷宫问题(C语言)