C语言回溯法九宫格数独问题
2017-11-02 21:48
459 查看
Problem H
数独游戏
时限: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>
#include<string.h>
int a[9][9];
void search(int n);
int canplace(int n,int i);
void output();
int main()
{
char b[9][10];
int q,j;
for(q=0;q<9;q++)
{
for(j=0;j<=9;j++)//由于输入数据之间不含空格,所以只能用字符串存起来再转换成整型数组
{
scanf("%c",&b[q][j]);
if(b[q][j]!='\n')//换行时字符串会自动读取换行符,所以应该考虑到这种情况
a[q][j]=b[q][j]-'0';//字符型数组转换成整型数组
}
}
search(0);//回溯法求解
return 0;
}
void search(int n)
{
int i;
if(n==81)output();
else if(a[n/9][n%9]!=0)search(n+1);若该位置上已有数字,则跳转至下一个位置
else if(a[n/9][n%9]==0)
{
for(i=1;i<=9;i++)
{
if(canplace(n,i))//判断该位置上能否放置数字i,若可以为其赋值,跳转至下一位置
{
a[n/9][n%9]=i;
search(n+1);
}
a[n/9][n%9]=0;若若找不到可以满足条件的数放置在该位置,还原它本来的值,回溯寻找下一组可能的解,每次调用完之后都需要让它返回与原来的值
}
}
}
int canplace(int n,int i)
{
int j,k,flag=1;
for(j=0;j<=8;j++)//判断该列上是否有该数字
{
if(a[n/9][j]==i)
{
flag=0;
break;
}
}
if(flag==1)
{
for(j=0;j<=8;j++)判断该行是否有该数字
{
if(a[j][n%9]==i)
{
flag=0;
break;
}
}
}
if(flag==1)//判断其所在的小九宫格里是否有该数字
{
for(j=(n/9/3)*3;j<(n/9/3)*3+3;j++)
{
for(k=(n%9/3)*3;k<(n%9/3)*3+3;k++)
{
if(a[j][k]==i)
{
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");
}
}
相关文章推荐
- 基于Las Vegas 和回溯法的皇后问题(C语言描述)
- C语言使用回溯法解旅行售货员问题与图的m着色问题
- C语言,回溯法0-1背包问题
- 回溯法( Backtracking Algorithms ) :C语言Maze迷宫问题(自己实现)
- C语言回溯法递归求解八皇后问题
- 01背包问题(用c语言实现)-回溯法求解
- C语言八皇后问题解决方法示例【暴力法与回溯法】
- 解析C语言中结构体struct的对齐问题
- 八皇后问题-C语言
- C语言必须知道的300个问题pdf
- C语言特殊要求的字符串问题
- C语言初级例题数学问题——水仙花数
- 回溯法(scheme) -- N皇后问题
- C语言字符串、指针和内存问题总结
- C语言中的Hanoi(汉诺塔)问题
- 山东理工大学ACM平台题答案关于C语言 1196 排序问题
- (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
- 什么是C语言?到底难不难学?——新手问题篇
- C语言进阶-6讲: 递归法问题求解
- C语言之typedef的问题