再次求助
查看原帖
再次求助
200044
JS_TZ_ZHR楼主2021/3/12 22:11

为什么改变X数组的顺序会影响结果啊/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 num,vector<int>a[]) {
	bool flag=1;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)flag&=(a[i][j]!=0);
	if(flag) {
		ans=max(ans,num);
		return;
	}
	int tot[10][10],_can[10][10][10],Cnt;
	node X[1005];
	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(!tot[i][j])return;
				if(tot[i][j]==1)a[i][j]=_can[i][j][1],flag=1,num+=query(i,j)*_can[i][j][1];
			}
	}
	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(!tot[i][j])return;
			Cnt++;
			X[Cnt].x=i;
			X[Cnt].y=j;
			X[Cnt].tot=tot[i][j];
		}
	if(!Cnt) {
		ans=max(ans,num);
		return;
	}
	//random_shuffle(X+1,X+Cnt+1); 就在这里 
	//sort(x+1,x+Cnt+1,cmp); 
	for(int i=1; i<=Cnt; i++) {
		for(int j=1; j<=X[i].tot; j++) {
			a[X[i].x][X[i].y]=_can[X[i].x][X[i].y][j];
			dfs(num+query(X[i].x,X[i].y)*_can[X[i].x][X[i].y][j],a);
			a[X[i].x][X[i].y]=0;
		}
	}
}
int main() {
	int 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);
			num+=query(i,j)*temp;
		}
	}
	dfs(num,a);
	if(ans)cout<<ans<<endl;
	else cout<<-1<<endl;
}
2021/3/12 22:11
加载中...