大佬帮忙看看这样的算法哪里有错
  • 板块P1784 数独
  • 楼主a1029
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/10/13 22:02
  • 上次更新2023/11/4 03:53:05
查看原帖
大佬帮忙看看这样的算法哪里有错
351392
a1029楼主2021/10/13 22:02

填到一半就填不下去了(样例自然没有过

#include <bits/stdc++.h>
using namespace std;

bool vis[10][10][10];
  
void dfs(int x, int y, int g[][10]) {
/*	puts("");
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= 9; j++)
			cout << g[i][j] << ' ';
		cout << endl;
	}
	puts("");*/
	while (g[x][y]) {
		if (x == 9 && y == 9) {
			for (int i = 1; i <= 9; i++) {
				for (int j = 1; j <= 9; j++)
					cout << g[i][j] << ' ';
				cout << endl;
			}
			exit(0);
		}
		if (y == 9) {
			y = 1;
			x++;
		}
		else y++;
	}
	for (int i = 1; i <= 9; i++) {
		bool flag = true;
		for (int j = 1; j <= 9; j++)
			if (g[x][j] == i) {
				flag = false;
				break;
			}
		if (!flag) continue;
		for (int j = 1; j <= 9; j++) {
			if (g[j][y] == i) {
				flag = false;
				break;
			}
		}
		if (!flag) continue;
		int dx = ((x - 1) / 3 + 1) * 3 - 2;
		int dy = ((y - 1) / 3 + 1) * 3 - 2;
		for (int j = dx; j <= dx + 2; j++)
			for (int k = dy; k <= dy + 2; k++)
				if (g[j][k] == i) {
					flag = false;
					break;
				}
		if (!flag) continue;
		g[x][y] = i;
		if (y == 9 /*&& !vis[x][y][i]*/) {
			//vis[x][y][i] = true;
			dfs(x + 1, 1, g);
		}
		else if (!vis[x][y][i]) {
			//vis[x][y][i] = true;
			dfs(x, y + 1, g);
		}
	}
}

int main()
{
	int g[10][10];
	for (int i = 1; i <= 9; i++)
		for (int j = 1; j <= 9; j++)
			cin >> g[i][j];
	dfs(1, 1, g);
	return 0;
}

2021/10/13 22:02
加载中...