蒟蒻求助
查看原帖
蒟蒻求助
200044
JS_TZ_ZHR楼主2021/3/12 15:19

为什么这样连合法方案都搜不到啊/yiw

#include<bits/stdc++.h>
using namespace std;
int n=9,ans;
int query(int i,int j) {
	if(i==1||i==9||j==1||j==9)return 6;
	if(i==2||i==8||j==2||j==8)return 7;
	if(i==3||i==7||j==3||j==7)return 8;
	if(i==4||i==6||j==4||j==6)return 9;
	return 10;
}
bool check(int x,int y,int k,vector<int>a[]) {
	for(int i=1; i<=n; i++)if(a[x][i]==k)return 0;
	for(int i=1; i<=n; i++)if(a[i][y]==k)return 0;
	for(int i=3*((x-1)/3)+1; i<=3*((x-1)/3)+3; i++)
		for(int j=3*((y-1)/3)+1; j<=3*((y-1)/3)+3; j++)if(a[i][j]==k)return 0;
	return 1;
}
struct node {
	int x,y,tot;
};
bool cmp(node u,node v) {
	return u.tot<v.tot;
}
void dfs(int sum,int num,vector<int>a[]) {
	if(sum==n*n) {
		ans=max(ans,num);
		return;
	}
	int tot[10][10],can[10][10][10],Cnt=0;
	node x[105];
	bool flag=1;
	while(flag) {
		flag=0;
		Cnt=0,memset(tot,0,sizeof(tot));
		for(int i=1; i<=n; i++)
			for(int j=1; j<=n; j++) {
				if(a[i][j])continue;
				for(int k=1; k<=n; k++)if(check(i,j,k,a))can[i][j][++tot[i][j]]=k;
				if(!a[i][j]&&!tot[i][j])return;
				if(tot[i][j]==1)a[i][j]=can[i][j][1],flag=1,sum++,num+=query(i,j)*can[i][j][1];
				if(!flag) {
					x[++Cnt].x=i;
					x[Cnt].y=j;
					x[Cnt].tot=tot[i][j];
				}
			}
	}
	sort(x+1,x+Cnt+1,cmp);
	for(int i=1; i<=Cnt; i++) {
		for(int j=1; j<=tot[x[i].x][x[i].y]; j++) {
			num+=query(x[i].x,x[i].y)*can[x[i].x][x[i].y][j];
			a[x[i].x][x[i].y]=can[x[i].x][x[i].y][j];
			dfs(sum+1,num,a);
			num-=query(x[i].x,x[i].y)*can[x[i].x][x[i].y][j];
			a[x[i].x][x[i].y]=0;
		}
	}
}
int main() {
	int cnt=0,num=0;
	vector<int>a[10];
	for(int i=1; i<=n; i++) {
		int temp;
		a[i].push_back(0);
		for(int j=1; j<=n; j++) {
			cin>>temp;
			a[i].push_back(temp);
			cnt+=(a[i][j]!=0),num+=query(i,j)*a[i][j];
		}
	}
	dfs(cnt,num,a);
	if(ans)cout<<ans<<endl;
	else cout<<-1<<endl;
}
2021/3/12 15:19
加载中...