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

来源:互联网 发布:cs 1.6 for mac 10.13 编辑:程序博客网 时间:2024/06/05 07:18

数独

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述

         数独是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个3*3宫内的数字均含1-9,不重复。 每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

       有一天hrdv碰到了一道号称是世界上最难的数独的题目,作为一名合格的程序员,哪能随随便便向困难低头,于是他决定编个程序来解决它。。


输入
第一行有一个数n(0< n <100),表示有n组测试数据,每组测试数据是由一个9*9的九宫格构成,0表示对应的格子为空
输出
输出一个9*9的九宫格,为这个数独的答案
样例输入
10 0 5 3 0 0 0 0 08 0 0 0 0 0 0 2 00 7 0 0 1 0 5 0 04 0 0 0 0 5 3 0 00 1 0 0 7 0 0 0 60 0 3 2 0 0 0 8 00 6 0 5 0 0 0 0 90 0 4 0 0 0 0 3 00 0 0 0 0 9 7 0 0
样例输出
1 4 5 3 2 7 6 9 8 8 3 9 6 5 4 1 2 7 6 7 2 9 1 8 5 4 3 4 9 6 1 8 5 3 7 2 2 1 8 4 7 3 9 5 6 7 5 3 2 9 6 4 8 1 3 6 7 5 4 2 8 1 9 9 8 4 7 6 1 2 3 5 5 2 1 8 3 9 7 6 4 

很经典的一道搜索题,开始深搜的时候每次都遍历棋盘,结果总是出现莫名其妙的问题,然后预处理了一下,最后就过了。

#include <stdio.h>#include <string.h>int arr[10][10], count;bool visrow[10][10], viscol[10][10], vissqu[10][10], ok;struct Node{int x, y;} tar[82];int getsqunum(int i, int j){return i / 3 * 3 + j / 3; //the charm of math}void print(){for(int i = 0; i < 9; ++i)for(int j = 0; j < 9; ++j)if(j != 8) printf("%d ", arr[i][j]);else printf("%d\n", arr[i][j]);}bool check(int i, int j, int k){int t = getsqunum(i, j);if(visrow[i][k] || viscol[j][k] || vissqu[t][k]) return 0;return 1;}void DFS(int k){if(k == count){ ok = 1; print(); return; }int t = getsqunum(tar[k].x, tar[k].y);for(int i = 1; i < 10; ++i){if(check(tar[k].x, tar[k].y, i)){visrow[tar[k].x][i] = 1;viscol[tar[k].y][i] = 1;vissqu[t][i] = 1;arr[tar[k].x][tar[k].y] = i;DFS(k + 1);if(ok) return;arr[tar[k].x][tar[k].y] = 0;visrow[tar[k].x][i] = 0;viscol[tar[k].y][i] = 0;vissqu[t][i] = 0;}}}int main(){int n; scanf("%d", &n);while(n--){memset(viscol, 0, sizeof(viscol));memset(visrow, 0, sizeof(visrow));memset(vissqu, 0, sizeof(vissqu));count = 0;for(int i = 0; i < 9; ++i)for(int j = 0; j < 9; ++j){scanf("%d", &arr[i][j]);if(arr[i][j]){visrow[i][arr[i][j]] = 1;viscol[j][arr[i][j]] = 1;vissqu[getsqunum(i, j)][arr[i][j]] = 1;}else{tar[count].x = i;tar[count++].y = j;}}//printf("input is ok\n");ok = 0; DFS(0); }return 0;}


0 0