Time Limit: 2000MS | Memory Limit: 65536K | |||
Total Submissions: 12005 | Accepted: 5984 | Special Judge |
Descriptionios
Inputgit
Outputapp
Sample Inputide
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Outputthis
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
題目大意:數獨填空。
解題方法:搜索。
#include <stdio.h> #include <iostream> #include <string.h> using namespace std; typedef struct { int x; int y; }Point; Point p[85]; char Maze[15][15]; int nCount = 0; bool bfind = false; bool Judge1(int row, int n) { for (int i = 0; i < 9; i++) { if (Maze[row][i] == n) { return false; } } return true; } bool Judge2(int col, int n) { for (int i = 0; i < 9; i++) { if (Maze[i][col] == n) { return false; } } return true; } bool Judge3(int row, int col, int n) { row = row / 3; col = col / 3; for (int i = row * 3; i < row * 3 + 3; i++) { for (int j = col * 3; j < col * 3 + 3; j++) { if (Maze[i][j] == n) { return false; } } } return true; } void DFS(int Step) { if (Step == nCount && !bfind) { bfind = true; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { printf("%d", Maze[i][j]); } printf("\n"); } } for (int i = 1; i <= 9; i++) { if (Judge1(p[Step].x, i) && Judge2(p[Step].y, i) && Judge3(p[Step].x, p[Step].y, i) && !bfind && Maze[p[Step].x][p[Step].y] == 0) { Maze[p[Step].x][p[Step].y] = i; DFS(Step + 1); Maze[p[Step].x][p[Step].y] = 0; } } } int main() { int nCase; char str[10]; scanf("%d", &nCase); memset(Maze, 0, sizeof(Maze)); while(nCase--) { nCount = 0; bfind = false; for (int i = 0; i < 9; i++) { scanf("%s", str); for (int j = 0; j < 9; j++) { Maze[i][j] = str[j] - '0'; if (Maze[i][j] == 0) { p[nCount].x = i; p[nCount].y = j; nCount++; } } } DFS(0); } return 0; }