NYOJ-数独

题目网址:http://acm.nyist.net/JudgeOnline/problem.php?pid=722

老套路,加深下这类题的思路。

  1 #include <stdio.h>
  2 #include <memory.h>
  3 #define NN 10///四宫格
  4 int ok;
  5     int a[NN][NN];//
  6     int flag_hang[NN][NN];//标记行的可选数字
  7     int flag_lie[NN][NN];;//标记列的可选数字
  8     int nine[NN][NN];//标记九宫格的可选数字
  9
 10 void next(int x,int y,int& c,int& d){///由(x,y)查找下一个可填格子的位置(c,d)
 11     int i,j;
 12     if(a[x][y] == 0){///当前格子为空
 13         c = x;
 14         d = y;
 15         return ;
 16     }
 17     for(i = x; i < NN; i++){
 18         for(j = y; j < NN; j++){
 19             if(a[i][j] == 0){
 20                 c = i;
 21                 d = j;
 22                 return ;
 23             }
 24         }
 25         y = 1;
 26     }
 27     if(i == NN && j == NN){
 28         ok = 1;
 29         return ;
 30     }
 31 }
 32
 33 void judge(int x,int y,int& figure){///查找相对于figure来说,(x,y)的下一个可填写数字
 34     for(int i = figure + 1; i < NN; i++)
 35         if(flag_hang[x][i] == 0 && flag_lie[y][i] == 0 && nine[3*((x-1)/3)+(y-1)/3][i] == 0){
 36             figure = i;
 37             return ;
 38         }
 39     figure = 0;
 40 }
 41
 42 int dfs(int x,int y,int figure){///将要填写的格子的坐标,figure为填写数字
 43     if(x >= NN || y >= NN)//a[x][y] != 0 ||
 44         return 1;
 45     ///填写完后要刷新行、列、九宫格
 46     a[x][y] = figure;
 47     flag_hang[x][a[x][y]] = 1;
 48     flag_lie[y][a[x][y]] = 1;
 49     nine[3*((x-1)/3)+(y-1)/3][a[x][y]] = 1;
 50
 51     int c=NN,d=NN,newfigure=0,i=1;///(c,d)下一个九宫格应该填写的位置
 52     do{
 53         next(x,y,c,d);
 54         if(ok == 1)
 55             return 1;
 56         judge(c,d,newfigure);
 57         if(newfigure != 0)
 58             dfs(c,d,newfigure);
 59     }while(newfigure != 0);
 60
 61     if(a[x][y] != 0){
 62         flag_hang[x][a[x][y]] = 0;
 63         flag_lie[y][a[x][y]] = 0;
 64         nine[3*((x-1)/3)+(y-1)/3][a[x][y]] = 0;
 65         a[x][y] = 0;
 66     }
 67     return 0;
 68 }
 69
 70 int main(){
 71     int n,i,j;
 72     scanf("%d",&n);
 73     while(n--){
 74         ok = 0;
 75         for(i = 0; i < NN; i++){
 76             memset(flag_hang[i],0,NN*sizeof(int));
 77             memset(flag_lie[i],0,NN*sizeof(int));
 78             memset(nine[i],0,NN*sizeof(int));
 79         }
 80         for(i = 1; i < NN; i++){
 81             for(j = 1; j < NN; j++){
 82                 scanf("%d",&a[i][j]);
 83                 flag_hang[i][a[i][j]] = 1;
 84                 flag_lie[j][a[i][j]] = 1;
 85                 nine[3*((i-1)/3)+(j-1)/3][a[i][j]] = 1;
 86             }
 87         }
 88         int x=1,y=1,figure=0;
 89         ///查找第一个可填位置
 90         for(i = 1; i < NN; i++)
 91         for(j = 1; j < NN; j++)
 92         if(a[i][j] == 0){
 93             x = i;
 94             y = j;
 95             goto L;
 96         }
 97         ///查找(x,y)格子的可填数字;
 98 L:      judge(x,y,figure);
 99
100         for(i = 1; i < NN; i++){
101             int result = dfs(x,y,figure);
102             if(result == 1)
103                 break;
104             judge(x,y,figure);
105         }
106         for(i = 1; i < NN; i++){
107             for(j = 1; j < NN; j++)
108                 printf("%d ",a[i][j]);
109             printf("\n");
110         }
111     }
112     return 0;
113 }
时间: 2024-11-25 07:19:41

NYOJ-数独的相关文章

NYOJ 722 数独 【DFS】+【预处理】

数独 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个3*3宫内的数字均含1-9,不重复. 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的. 有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它.. 输入 第一行有一个

NYOJ 722 数独

数独 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行.每一列.每一个3*3宫内的数字均含1-9,不重复. 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的. 有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它.. 输入 第一行有一个

NYOJ 搜索题目汇总 NYOJ 20、21、27、42、58、82、202、284、325、353、488、491、523、592、722

NYOJ 搜索题目汇总 NYOJ 20 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<vector> #include<algorithm> using namespace std; int pre[100005]; vector<int>v[100005];//存储每个结点相邻的边 void DFS(int

第二次作业——个人项目实战:数独

1.阅读 刚开始泛看<构建之法>的时候,还是觉得非常难理解里面的内容,特别是代码部分.后来第二次拿起这本书,从第一章开始看起,慢慢了解了"软件企业=软件+商业模式"和对软件工程的定义,但是更多地还是记忆了一遍,没有明白这里面的深意:看第二章的时候,跟着单元测试.回归测试的.效能分析的内容自己照着书上的代码敲了一敲,偶尔会出现bug,但是能得到书上所说的效果还是很开心的,效能分析,感觉就是代码的效率问题,追求高效,然后接触到了软件工程师的一套模型-个人开发流程PSP,我也尝试

洛谷 【P1074】靶形数独

P1074 靶形数独 题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教, Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格 高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9 的数字.每

#计算机#数独

数独是一项益智小游戏,规则简单易懂,但内容千变万化.这次我想要研究的是用java编程实现解数独和数独题目的生成.首先要弄清数独的游戏规则:在一个9×9的方格中分布着1-9的数字和空格,玩家在空格中填写适当的数字,使得每行.每列.9个3×3的方格中数字1-9均只出现一次. 对于解数独初步构思的时候我产生了两种想法: 第一种想法利用计算机强大的运算能力,遍历当前空格所有可以填入的数字,向后递归,当某个空格不能填入数字,而空格数不为零时返回上一步.如果某一步只能填入一个确定的数字,可以把这一步优先填好

安卓旅途之——开发数独(一)

安卓旅途之——开发数独(一) 数独游戏简介 数独游戏,是一种数学智力拼图游戏,是“独立的数字游戏”的简称,源自18世纪末的瑞士,后在美国发展,在日本得以发扬光大. 数独游戏可以训练玩家的逻辑推理能力,不少教育者皆认为数独是锻炼脑筋的好方法. 其规则如下: 1.游戏会从一个部分带有数字的九宫格开始. 在9×9的大九宫格(即3格宽×3格高)方阵里,每一格又细分为一个小九宫格. 2.游戏开始,已给定若干数字,其它宫位留白,玩家需要自己按照逻辑推敲出剩下的空格里是什么数字. 3.填数字时必须满足以下条件

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

NYOJ 49 开心的小明

开心的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 小明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行".今天一早小明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的N 元.于是,他把每件物品规定了一个重要度,分为5 等:用整数1~5 表示,第5 等最重要.他还从因特网上查到了每件物品的价格(都是整数元).

NYOJ 106 背包问题

背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10):如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大. 输入 第一行输入一个正整数n(1<=n<=5),表示有n组测试数据: 随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10