社区讨论

新人刚学OI搜索求助

UVA12988Sudoku参与者 6已保存回复 5

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@mi6tcxy2
此快照首次捕获于
2025/11/20 10:30
4 个月前
此快照最后确认于
2025/11/20 10:30
4 个月前
查看原帖
就是一个简单4*4的数独,调了好久了,一直没调出来,该怎么办?
CPP
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std;
const int maxn=7;
int p[maxn][maxn];
int block[maxn][maxn];
int line[maxn][maxn],col[maxn][maxn];
inline bool check(int x,int y,int s){
	if(x<=2&&y<=2)return block[1][s];
	else if(x<=2&&y>=3)return block[2][s];
	else if(x>=3&&y<=2)return block[3][s];
	//else if(x<=4&&x>=3&&y>=3&&y<=4)
	return block[4][s];
}
inline void modify(int x,int y,int s,int ss){
	line[x][s]=ss,col[y][s]=ss;
	if(x<=2&&y<=2)block[1][s]=ss;
	else if(x<=2&&y>=3)block[2][s]=ss;
	else if(x>=3&&y<=2)block[3][s]=ss;
	else if(x>=3&&y>=3)block[4][s]=ss;
	return ;
}
bool dfs(int x,int y){
	if(x==5)return 1;
	if(!p[x][y]){
		//int o=p[x][y];
		for(register int i=1;i<=4;i++){
			if(line[x][i]==0&&col[y][i]==0&&check(x,y,i)==0){
			    p[x][y]=i;
                modify(x,y,i,1);	
                if(y==4)return dfs(x+1,1);
				else return dfs(x,y+1);
				modify(x,y,i,0);
				p[x][y]=0;
			}
		}
	}
	if(y==4)return dfs(x+1,1);
	return dfs(x,y+1);
}
int main()
{
	int t;
	char x,bb[maxn];
	scanf("%d",&t);
	for(register int k=1;k<=t;k++){
		for(register int i=1;i<=4;i++){
		    scanf("%s",bb+1);
			for(register int j=1;j<=4;j++){
				x=bb[j];//scanf("%c",&x);
				if(isdigit(x))p[i][j]=x-48,modify(i,j,x-48,1);
			}
		 }
		/* for(int i=1;i<=4;i++){
		     for(int j=1;j<=4;j++)cout<<p[i][j];
		     puts(" ");
		 }*/
		dfs(1,1);
		printf("Case #%d:\n",k);
		for(register int i=1;i<=4;i++){
			for(register int j=1;j<=4;j++){
				printf("%d",p[i][j]);
			}
			if(k!=t||i!=4)putchar('\n');
	    }
	    memset(p,0,sizeof(p));
	    memset(line,0,sizeof(line));
	    memset(col,0,sizeof(col));
	    memset(block,0,sizeof(block));
	}
	return 0;
}

回复

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

正在加载回复...