为什么我的搜索跑了半天啥都跑不出来
查看原帖
为什么我的搜索跑了半天啥都跑不出来
658786
STUDENT00楼主2022/9/13 20:12

世界上最好理解的代码!!!

#include<bits/stdc++.h>
using namespace std;
int a[5][5];
bool vis[20];
bool check(){
	for(int i=1;i<=4;i++){
		int s=34;
		for(int j=1;j<4;j++) s-=a[j][i];
		if(s<=0||s>16||vis[s]) return 0;
		a[4][i]=s;
		vis[s]=1;
	}
	vis[a[4][1]]=vis[a[4][2]]=vis[a[4][3]]=vis[a[4][4]]=0;
	if(a[1][1]+a[1][4]+a[4][1]+a[4][4]==34&&a[1][3]+a[1][4]+a[2][3]+a[2][4]==34&&a[3][1]+a[3][2]+a[4][1]+a[4][2]==34&&a[3][3]+a[3][4]+a[4][3]+a[4][4]==34&&a[1][1]+a[2][2]+a[3][3]+a[4][4]==34&&a[1][4]+a[2][3]+a[3][2]+a[4][1]==34) return 1;
	return 0;
} 
void print(){
	for(int i=1;i<=4;i++){
		for(int j=1;j<=4;j++) printf("%d ",a[i][j]);
		printf("\n");
	}
	printf("\n");
}
void dfs(int x,int y){
	if(x==4){
		if(check()) print();
		return;
	}
	if(y==4){
		a[x][y]=34-a[x][y-1]-a[x][y-2]-a[x][y-3];
		if(a[x][y]<=0||a[x][y]>16||vis[a[x][y]]) return;
		vis[a[x][y]]=1;
		dfs(x+1,1);
		vis[a[x][y]]=0;
	}else{
		if(x==2&&y==2){
			a[x][y]=34-a[x-1][y-1]-a[x-1][y]-a[x][y-1];
			if(a[x][y]<=0||a[x][y]>16||vis[a[x][y]]) return;
			vis[a[x][y]]=1;
			dfs(x,y+1);
			vis[a[x][y]]=0;
		}else{
			for(int i=1;i<=16;i++){
				if(!vis[i]){
					vis[i]=1;
					a[x][y]=i;
					dfs(x,y+1);
					vis[i]=0;
				}
			}
		}
	}
}
int main(){
	dfs(1,1);
	return 0;
}
2022/9/13 20:12
加载中...