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的更多相关文章

  1. POJ2676Sudoku(类似于八皇后)

    Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16444   Accepted: 8035   Special ...

  2. POJ2676-Sudoku(数独)

    想了好久没想到好的解决办法,参考了 http://user.qzone.qq.com/289065406/blog/1303713313 大致题意: 九宫格问题,也有人叫数独问题 把一个9行9列的网格 ...

  3. 【基础搜索】poj-2676-Sudoku(数独)--求补全九宫格的一种合理方案

      数独 时限:2000 MS   内存限制:65536K 提交材料共计: 22682   接受: 10675   特别法官 描述 数独是一个非常简单的任务.一个9行9列的正方形表被分成9个较小的3x ...

  4. HDU 1426 Sudoku Killer【DFS 数独】

    自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品— ...

随机推荐

  1. oracle连接和执行流程总结

    参考关于oracle连接及一个事务的完整流程分析的资料,做整理如下 参考资料: http://blog.csdn.net/wyzxg/archive/2010/08/16/5815335.aspx h ...

  2. 【风马一族_git_github】github项目建成网站

    ---------------------------------------- 1)点击 Settings 2)上一个红色矩形是访问的网址,下一个红色矩形是用来设置页面相关的信息 3)页面信息的修改 ...

  3. 自己手写简约实用的Jquery tabs插件(基于bootstrap环境)

    一直想改版网站首页的图书展示部分,以前的展示是使用BootStrap的传统的collapse,网页篇幅占用大,也不够美观,操作也相对来说比较麻烦.于是有了自己利用Jquery来做一个图书展示的tabs ...

  4. RxJava 平常使用

    本文转载自: http://blog.csdn.net/theone10211024/article/details/50435325 一.Scheduler线程切换 这种场景经常会在“后台线程取数据 ...

  5. rhel_7.x 安装mysql

    http://database.51cto.com/art/201310/413006.htm MariaDB和MySQL --mysql-5.7.12-1.el7.x86_64.rpm-bundle ...

  6. ZK framework on Java

    Quick start: https://www.zkoss.org/documentation Live demo: https://www.zkoss.org/zkdemo/file_handli ...

  7. php 伪静态 (url rewrite mod_rewrite 重写)

    mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面.下面我详细说说它的使用方法!对初学者很有用的哦!1.检测Apache是否支持mod_rewrite通过php提供的php ...

  8. Android:什么是Holo?【Translated By KillerLegend】

    Android:什么是Holo? Martin Brinkmann on May 6, 2013 in Google Android 3 [Translated By KillerLegend] 当你 ...

  9. MySQL 5.7.11 重置root密码

    .修改/etc/my.conf,添加参数skip-grant-tables .重启mysql service mysqld stop service mysqld start .用root 直接登录 ...

  10. .NET开发之窗体间的传值转化操作

    DOTNET开发之窗体间的传值转化操作 好想把自己最近学到的知识写下来和各位朋友分享,也希望得到大神的指点.今天终于知道自己要写点什么,就是关于WPF开发时简单的界面传值与简单操作. 涉及两个界面:一 ...