POJ2676Sudoku
http://poj.org/problem?id=2676
题意 : 这个是我最喜欢玩的数独了,就是一个9乘9的宫格,填上1到9九个数字,每行每列每个宫格之内不能有重复的数字,给出的九宫格中,0是待填的数字,其他数字是已经填好的,若是无法按要求填出来,就输出原来的九宫格;
思路 : DFS,深搜递归一下,设三个标记数组,标记一下每行的,每列的,每个宫格的,如果这个数字出现了,就标记了就行,我代码里写的是标记数组row[ i ][ j ],代表的是第 i 行的 j 已经出现了,col[ i ][ j ]代表的是第 i 行的 j 数组存在,map[ i ][ j ]宫格 i 的 j 这个数字存在,而宫格的话大家可以自己想一下,如果一个位置的行和列是x,y,那么他所在的九宫格就应该是3*((x-1)/3)+(y-1)/3+1,但如果你往里输入的九宫格下标是从0开始的话,这个就要变成x/3*3+y/3,我也试过,但是从0开始存一直都是错的,后来就改为从一开始存了
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
int row[][],col[][],map[][];//行列宫格的标记数组
int Sudoku[][];
int flag ;//标记变量
int DFS(int x,int y)
{
if(x == )
{
for(int i = ; i <= ; i++)
{
for(int j = ; j <= ; j++)
printf("%d",Sudoku[i][j]);
printf("\n");
}
return ;
}
flag = ;
if(Sudoku[x][y])//该位置原本是有数字的
{
if(y == )
flag = DFS(x+,);
else
flag = DFS(x,y+);
if(flag)
return ;
else
return ;
}
else
{
for(int i = ; i <= ; i++)
if(!row[x][i] && !col[y][i] && !map[*((x-)/)+(y-)/+][i])//如果行列宫格都没有这个数字
{
Sudoku[x][y] = i;//就填上这个数字,然后下边的行列宫格都标记为已填此数字
row[x][i]= ;
col[y][i]= ;
map[*((x-)/)+(y-)/+][i] = ;
if(y == )
flag=DFS(x+,);
else
flag=DFS(x,y+);
if(!flag)//如果没找到合适的,就全部返回原值
{
Sudoku[x][y]=;
row[x][i] = ;
col[y][i]= ;
map[*((x-)/)+(y-)/+][i]=;
}
else
return ;
}
}
return ;
}
void Init()
{
memset(row,,sizeof(row));
memset(col,,sizeof(col));
memset(map,,sizeof(map));
}
int main()
{
int i,j,n;
scanf("%d",&n);
for(int s = ; s < n ; s++)
{
Init();
for(i = ; i <= ; i++)
for(j = ; j <= ; j++)
{
scanf("%1d",&Sudoku[i][j]);
if(Sudoku[i][j])
{
row[i][Sudoku[i][j]] = ;
col[j][Sudoku[i][j]] = ;
map[*((i-)/)+(j-)/+][Sudoku[i][j]] = ;
}
}
DFS(,);
}
return ;
}
POJ2676Sudoku的更多相关文章
- POJ2676Sudoku(类似于八皇后)
Sudoku Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16444 Accepted: 8035 Special ...
- POJ2676-Sudoku(数独)
想了好久没想到好的解决办法,参考了 http://user.qzone.qq.com/289065406/blog/1303713313 大致题意: 九宫格问题,也有人叫数独问题 把一个9行9列的网格 ...
- 【基础搜索】poj-2676-Sudoku(数独)--求补全九宫格的一种合理方案
数独 时限:2000 MS 内存限制:65536K 提交材料共计: 22682 接受: 10675 特别法官 描述 数独是一个非常简单的任务.一个9行9列的正方形表被分成9个较小的3x ...
- HDU 1426 Sudoku Killer【DFS 数独】
自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品— ...
随机推荐
- 一款类似塔防类的保卫羊村游戏android源码
一款类似塔防类的保卫羊村游戏源码,这个游戏很像我们平时玩的塔防游戏的,游戏的源码比较完整的,大家可以修改一下或者添加一些广告就可以上线到应用商店了,而且这个游戏目前已经上线国内的一些应用商店了,360 ...
- 初步了解SequoiaDB数据库
随着企业中日益复杂与多变的需求,以及迅速扩展带来的海量数据的业务,IT部门需要将越来越多的信息提供给用户,同时在现今的全球经济背景环境下,IT部 门还需要在提供高效服务的同时,降低其设备与程序维护成本 ...
- Android关于buildToolVersion与CompileSdkVersion的区别
StackOverFlow中对这个问题进行了详细的讨论:http://stackoverflow.com/questions/24521017/android-gradle-buildtoolsver ...
- C# sogou地图API应用总结
地图的初始化1.添加引用地图的API文件: <script src="http://api.go2map.com/maps/js/api_v2.5.1.js" type=&q ...
- RaddioButton控件
<GroupBox Margin="5"> <StackPanel> <RadioButton IsChecked="true"& ...
- JAVA中toString方法
因为它是Object里面已经有了的方法,而所有类都是继承Object,所以"所有对象都有这个方法". 它通常只是为了方便输出,比如System.out.println(xx),括号 ...
- uImage、zImage、bzImage、vlinzx区别
在网络中,不少服务器采用的是Linux系统.为了进一步提高服务器的性能,可能需要根 据特定的硬件及需求重新编译Linux内核.编译Linux 内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要 ...
- 加载驱动模块时Device or resource busy的解决方法
加载驱动模块时Device or resource busy的解决方法 加载驱动模块时Device or resource busy的解决方法 insmod或modprobe驱动模块时Device o ...
- 【quartz】 入门-配置文件
quartz 启动 NameValueCollection props = (NameValueCollection)ConfigurationManager.GetSection("qua ...
- OpenWrt刷机后LAN口无法连通的问题
[路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...