原地去世、智慧的提问
  • 板块P1784 数独
  • 楼主123uuu
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/27 12:56
  • 上次更新2023/11/27 17:53:59
查看原帖
原地去世、智慧的提问
539712
123uuu楼主2023/11/27 12:56
#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分求调

2023/11/27 12:56
加载中...