本文主要是介绍【dfs】数独游戏(ybtoj dfs-1-2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
数独游戏
ybtoj dfs-1-3
题目大意
给出一个未完成的数独,让你完成它
输入样例
4.....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......
......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
end
输出样例
417369825632158947958724316825437169791586432346912758289643571573291684164875293
416837529982465371735129468571298643293746185864351297647913852359682714128574936
解题思路
直接暴力枚举每一个位置写什么数字即可
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int g, ans, a[15][15], p1[15][15], p2[15][15], p[15][15][15];
string str;
void add(int x, int y, int z)
{p[x / 3][y / 3][z] ^= 1;p1[x][z] ^= 1;p2[y][z] ^= 1;
}
bool pp(int x, int y, int z)
{return !(p[x / 3][y / 3][z] || p1[x][z] || p2[y][z]);
}
void dfs(int x, int y)
{if (x == 9){for (int i = 0; i < 9; ++i)for (int j = 0; j < 9; ++j)putchar(a[i][j] + 48);putchar(10);g = 1;return;}if (a[x][y]){dfs(x + (y + 1) / 9, (y + 1) % 9);return;}for (int i = 1; i <= 9; ++i)if (pp(x, y, i))//判断能不能写这个数字{a[x][y] = i;add(x, y, i);//对于同一个行,列或方格中的数字的约束dfs(x + (y + 1) / 9, (y + 1) % 9);if (g) return;add(x, y, i);a[x][y] = 0;}
}
int main()
{while(cin>>str){if (str[0] == 'e') break;memset(a, 0, sizeof(a));memset(p, 0, sizeof(p));memset(p1, 0, sizeof(p1));memset(p2, 0, sizeof(p2));g = 0;for (int i = 0; i < 9; ++i)for (int j = 0; j < 9; ++j){if (str[g] != '.') a[i][j] = str[g] - 48, add(i, j, a[i][j]);g++;}g = 0;dfs(0, 0);}return 0;
}
这篇关于【dfs】数独游戏(ybtoj dfs-1-2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!