列表

详情


NC19929. [CQOI2013]新数独

描述

下面是一个没有数字,只有大小关系(没错,那些尖角都是“大于符号”)!的数独:

除了大小关系外(注意相邻格子不能相同),还需要满足通常的数独规则:

输入描述

输入一共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;
}

上一题