大佬救我......
  • 板块P1784 数独
  • 楼主oyht123
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/1 14:55
  • 上次更新2025/1/1 19:36:12
查看原帖
大佬救我......
708533
oyht123楼主2025/1/1 14:55
#include<bits/stdc++.h>
using namespace std;
int mp[10][10];
void print() {
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= 9; j++) {
			cout << mp[i][j] << " ";
		}
		cout << endl;
	}
	exit(0);
}
bool pd(int x, int y, int pas) {//判断合法
	//行列判断
	for (int i = 1; i <= 9; i++) {
		if (mp[x][i] == pas) {
			return false;
		}
	}
	for (int i = 1; i <= 9; i++) {
		if (mp[i][y] == pas) {
			return false;
		}
	}
	//宫格判断
	while (x % 3 != 1) {
		x--;
	}
	while (y % 3 != 1) {
		y--;
	}
	for (int i = x; i <= x + 2; i++) {
		for (int z = y; z <= y + 2; z++) {
			if (mp[i][z] == pas) {
				return false;
			}
		}
	}

	return true;
}
void dfs(int x, int y) {
	if (x == 10 && y == 1) {
		print();
		return ;
	}
	if (mp[x][y] == 0) {
		for (int i = 9; i >= 1; i--) {

			if (pd(x, y, i)) {
				mp[x][y] = i;
				if (y == 9) {
					dfs(x + 1, 1);
					mp[x][y] = 0;
				} else {
					dfs(x, y + 1);
					mp[x][y] = 0;
				}
			}
		}
	} else {
		if (y == 9) {
			dfs(x + 1, 1);
		} else {
			dfs(x, y + 1);
		}
	}
}
int main() {
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= 9; j++) {
			cin >> mp[i][j];
		}
	}
	dfs(1, 1);
	return 0;
}

用了深搜算法,第四个测试点TLE了

测试点图片

2025/1/1 14:55
加载中...