NC19929. [CQOI2013]新数独
描述
下面是一个没有数字,只有大小关系(没错,那些尖角都是“大于符号”)!的数独:
除了大小关系外(注意相邻格子不能相同),还需要满足通常的数独规则:
每个 3∗3 的子矩阵(上图中用粗线隔开,一共有3∗3个这样的子矩阵)都是1~9的排列
为了美观,每个3∗3子矩阵的所有12对相邻格子的大小关系都将给出。
输入描述
输入一共15行,包含一个新数独的实例。第奇数行包含左右方向的符号( < 和 > ),第偶数行包含上下方向的符号(^和v)。
输出描述
输出包含9行,每行9个1~9的数字,以单个空格隔开。输入保证解惟一。
示例1
输入:
< > > < > < v v ^ ^ v v ^ ^ ^ < < > < > < ^ ^ ^ v ^ ^ ^ v v < < < < > > > < > > > > v ^ ^ ^ ^ v v v ^ > > > > < > v v ^ v ^ v ^ v ^ > < < > > > < < < < > < v ^ v v v v ^ ^ v < > > < < > ^ v v v ^ v ^ v v < > < > < >
输出:
4 9 1 7 3 6 5 2 8 2 3 7 8 1 5 6 4 9 5 6 8 2 4 9 7 3 1 9 1 3 6 5 4 8 7 2 8 5 4 9 7 2 1 6 3 7 2 6 3 8 1 9 5 4 3 4 9 5 6 8 2 1 7 1 8 5 4 2 7 3 9 6 6 7 2 1 9 3 4 8 5
C++(clang++ 11.0.1) 解法, 执行用时: 730ms, 内存消耗: 496K, 提交时间: 2023-08-10 18:22:06
#include <bits/stdc++.h> using namespace std; int v[10][10], G[10][10][2]; bool row[10][10], col[10][10], gird[10][10]; bool dfs(int x, int y) { if (y == 10) { if (x == 9) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { cout << v[i][j] << ' '; } cout << '\n'; } return 1; } x++, y = 1; } for (int i = 1; i <= 9; i++) { int t = (x - 1) / 3 * 3 + (y - 1) / 3 + 1; if (row[x][i] || col[y][i] || gird[t][i]) continue; if (y > 1) { if (G[x][y - 1][0] > 0 && !(v[x][y - 1] > i)) continue; if (G[x][y - 1][0] < 0 && !(v[x][y - 1] < i)) continue; } if (x > 1) { if (G[x - 1][y][1] > 0 && !(v[x - 1][y] > i)) continue; if (G[x - 1][y][1] < 0 && !(v[x - 1][y] < i)) continue; } v[x][y] = i; row[x][i] = col[y][i] = gird[t][i] = 1; if (dfs(x, y + 1)) return 1; row[x][i] = col[y][i] = gird[t][i] = 0; } return 0; } void solve() { char ch; for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (j % 3 == 0) continue; cin >> ch; if (ch == '>') G[i][j][0] = 1; else G[i][j][0] = -1; } for (int j = 1; j <= 9; j++) { if (i % 3 == 0) continue; cin >> ch; if (ch == 'v') G[i][j][1] = 1; else G[i][j][1] = -1; } } dfs(1, 1); } signed main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); solve(); return 0; }