HDU 1476 Sudoku Killer
Sudoku Killer
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3367 Accepted Submission(s): 1063
数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
例题:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int map[10][10];
int hash[10][10][10];
int flag;
int ans;
int sum;
int str;
struct Node
{
int x;
int y;
};
Node empty[100];
bool judge(int step,int k)
{
int x = empty[step].x;int y = empty[step].y;
for(int i = 1;i <= 9;i ++)
if(k == map[i][y])
return false;
for(int i = 1;i <= 9;i ++)
if(k == map[x][i])
return false;
if(x <= 3)
{
if(y <= 3)
{
for(int i = 1;i <= 3;i ++)
for(int j = 1;j <= 3;j ++)
if(map[i][j] == k)
return false;
}
if(y <= 6 && y > 3)
{
for(int i = 1;i <= 3;i ++)
for(int j = 4;j <= 6;j ++)
if(map[i][j] == k)
return false;
}
if(y <= 9 && y > 6)
{
for(int i = 1;i <= 3;i ++)
for(int j = 7;j <= 9;j ++)
if(map[i][j] == k)
return false;
}
}
if(x > 3 && x <= 6)
{
if(y <= 3)
{
for(int i = 4;i <= 6;i ++)
for(int j = 1;j <= 3;j ++)
if(map[i][j] == k)
return false;
}
if(y <= 6 && y > 3)
{
for(int i = 4;i <= 6;i ++)
for(int j = 4;j <= 6;j ++)
if(map[i][j] == k)
return false;
}
if(y <= 9 && y > 6)
{
for(int i = 4;i <= 6;i ++)
for(int j = 7;j <= 9;j ++)
if(map[i][j] == k)
return false;
}
}
if(x > 6 && x <= 9)
{
if(y <= 3)
{
for(int i = 7;i <= 9;i ++)
for(int j = 1;j <= 3;j ++)
if(map[i][j] == k)
return false;
}
if(y <= 6 && y > 3)
{
for(int i = 7;i <= 9;i ++)
for(int j = 4;j <= 6;j ++)
if(map[i][j] == k)
return false;
}
if(y <= 9 && y > 6)
{
for(int i = 7;i <= 9;i ++)
for(int j = 7;j <= 9;j ++)
if(map[i][j] == k)
return false;
}
}
return true;;
}
void DFS(int step)
{
if(sum + 1 == step)
{
flag = 1;
return ;
}
for(int i = 1;i <= 9;i ++)
{
if(judge(step,i) == 1)
{
map[empty[step].x][empty[step].y] = i;
DFS(step + 1);
if(flag == 1)
return ;
map[empty[step].x][empty[step].y] = 0;
}
}
}
int main()
{
int cnt = 0;
while(~scanf(" %c",&str))
{
memset(hash,0,sizeof(hash));
memset(map,0,sizeof(map));
sum = 1;
if(str == '?')
{
empty[sum].x = 1;empty[sum ++].y = 1;
}
else
map[1][1] = str - 48;
for(int i = 1;i <= 9;i ++)
for(int j = 1;j <= 9;j ++)
{
if(i == 1 && j == 1)
continue ;
scanf(" %c",&str);
if(str == '?')
{
empty[sum].x = i;empty[sum ++].y = j;
}
else
map[i][j] = str - 48;
}
sum --;
flag = 0;
DFS(1);
if(cnt ++)
printf("\n");
for(int i = 1;i <= 9;i ++)
{
for(int j = 1;j < 9;j ++)
printf("%d ",map[i][j]);
printf("%d\n",map[i][9]);
}
}
return 0;
}
using namespace std;
#include<stdio.h>
#include<string.h>
struct point{
int x,y;
}pur[100];
int map[10][10],flag,num;
int check(int k,int cur)
{
int i,j,x,y;
for(i=0;i<9;i++)
if(map[pur[cur].x][i]==k||map[i][pur[cur].y]==k)return 0;
x=(pur[cur].x/3)*3;
y=(pur[cur].y/3)*3;
for(i=x;i<x+3;i++)
for(j=y;j<y+3;j++)
if(map[i][j]==k)return 0;
return 1;
}
void DFS(int step)
{
int i,j;
if(step==num){
for(i=0;i<9;i++)
{
for(j=0;j<8;j++)
printf("%d ",map[i][j]);
printf("%d\n",map[i][8]);
}
flag=1;
return;
}
else{
for(i=1;i<=9;i++)
{
if(check(i,step)&&!flag)
{
map[pur[step].x][pur[step].y]=i;
DFS(step+1);
map[pur[step].x][pur[step].y]=0;
}
}
}
return;
}
int main()
{
int i,j,cas=0;
char s[3];
while(scanf("%s",s)!=EOF)
{
num=0;
if(s[0]=='?'){pur[num].x=0;pur[num].y=0;num++;map[0][0]=0;}
else map[0][0]=s[0]-'0';
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
if(i==0&&j==0)continue;
scanf("%s",s);
if(s[0]=='?'){pur[num].x=i;pur[num].y=j;num++;map[i][j]=0;}
else map[i][j]=s[0]-'0';
}
flag=0;
if(cas++)printf("\n");
DFS(0);
}
return 0;
}
转载于:https://www.cnblogs.com/GODLIKEING/p/3330943.html
HDU 1476 Sudoku Killer相关推荐
- HDU 1426 Sudoku Killer【DFS 数独】
自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品 ...
- HDU 1426 Sudoku Killer
数独(DFS). 非常忧伤的一道题,先是剪枝的三个数组开成[9][9]导致 越界了WA. 然后就是每两组输出之间有空行,可是最后一组后面不能输出空行.PE好多次. #include<cstdio ...
- HDU1426 Sudoku Killer DFS
点击打开链接 Sudoku Killer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- 杭电oj 1426 Sudoku Killer(深度优先搜索 回溯)
Sudoku KillerTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- Sudoku Killer(HDU-1426)
Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会将数独列为一个单独的项目进行 ...
- hdu1426 Sudoku Killer
简单的DFS,将所有未填的位置依次保存起来,之后,对每一个未填的位置依次枚举,往下搜即可 :: 本来想用DLX的做的,hdu3111是过了,可是原先那个模板在这道题里就是超时,不解啊,换一个模板就过了 ...
- 杭电OJ分类题目(1)
原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(1) HDU Introduction HDU ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
最新文章
- Nginx服务启动脚本
- 技术专家预测未来25大颠覆性硬趋势
- 获取服务(getService)
- Erlang的边界检查(3)
- 机器学习Sklearn实战——adaboost
- Java中栈和队列的用法 Stack And Queue
- Linux内核分析 - 网络
- 谷歌地球最新host_听说《流浪地球》被豆瓣鄙视了,我们用数据看一把真相(上)...
- 特别看好高校团队的联想创投,在中科大拉开高校AI精英挑战赛大幕
- CPU-AMD处理器的驱动下载地址
- python 排程问题仿真_APS自动生产排程系统-用户常见问题及解答
- 拟物化设计与扁平化设计
- 他是马化腾的偶像,拒绝马云的应聘 !如今劝年轻人不要太拼、要认命......
- Photoshop(PS)CC2020安装教程【64位】
- 本次技术博客平台的选择
- 如何入门Python之Python基础教程详解
- Your Command Line Tools are too outdated
- 统计学之离散指标(全距、内距、异众比率、平均差与标准差)
- socks5代理IP的几种测试工具
- idea高版本设置注入飘红(红色波浪线)
热门文章
- 在微型计算机中1 mb准确等于几个字,2010安徽省计算机等级考试二级试题及答案...
- 输出指定范围内的完数
- 《零基础》MySQL 教程(一)
- ccf魔数c语言,ccf 201609-4 交通规划
- 安装了虚拟机后mysql用不了_在虚拟机上安装mysql,安装好了并且初始化之后,一直无法启动mysql如何解决?...
- java下文_java实现文件下载的两种方式
- mysql的操作语句_Mysql最常用的操作语句收集
- MySQL 常用运算符
- Redis DeskTop Manager 使用教程
- 删除a标签下面的横线