社区讨论

原地去世、智慧的提问

P1784数独参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lpgfthn3
此快照首次捕获于
2023/11/27 12:57
2 年前
此快照最后确认于
2023/11/27 17:53
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int mp[10][10],sx,sy,cx,cy,fx,fy; 
bool va[10][10], vb[10][10], vc[10][10];
/*bool check(int ax,int ay,int x){//这个函数是判断数独上,行和列和宫有没有相同的数字,如果有,return 1; 
	int ni = 3*((ax - 1) / 3) ,nj = 3*((ay - 1) / 3) ;//ni,nj分别是横坐标和纵坐标具体的计算方法 
		for (i = 1;i <= 9; ++ i){//行有没有相同的数字
			if (mp[i][ay] == x) return 1;
		}
		for (j = 1;j <= 9; ++ j){//列有没有相同的数字 
			if (mp[ax][j] == x) return 1;
		}
		for (i = ni + 1;i <= ni + 3; ++ i){//宫有没有相同的数字 
			for (j = nj + 1;j <= nj + 3; ++ j){
				if(mp[i][j] == x) return 1;
			}
		}
		return 0;//都没有相同的返回0,表示可以填 
}*/
void dfs(int nx,int ny){
	int i,j,nz = (nx - 1) / 3 * 3 + (ny - 1) / 3 + 1;;
	if (nx == 10){
		for(i = 1;i <= 9; ++ i){
			for(j = 1;j <= 9; ++ j){
				cout << mp[i][j] << " ";
			}
			cout << endl;
		}
		exit(0);
	}
	if (ny == 10){
		dfs(nx + 1, 1);
		return;
	}
	if (mp[nx][ny]){
		dfs(nx, ny + 1);
		return;
	}
	for (i = 1;i <= 9; ++ i){
			if(va[nx][i] != 0 && vb[ny][i] != 0 && vc[nz][i] != 0){
				mp[nx][ny] = i;
				va[nx][i] = 1;
				vb[ny][i] = 1;
				vc[nz][i] = 1;
				dfs(nx, ny + 1);
				mp[nx][ny] = 0;
				va[nx][i] = 0;
				vb[ny][i] = 0;
				vc[nz][i] = 0;
			}
		}
		return;
}
int main(){
	int i,j;
	for(i = 1;i <= 9; ++i){
		for(j = 1;j <= 9; ++j){
			cin>>mp[i][j];
			va[i][mp[i][j]] = 1;
			vb[j][mp[i][j]] = 1;
			int az = (i - 1) / 3 * 3 + (j - 1) / 3 + 1;
			vc[az][mp[i][j]] = 1;
		}
	}
			dfs(1, 1);
return 0;
} 
0分求调

回复

0 条回复,欢迎继续交流。

正在加载回复...