90score | WA on #01
查看原帖
90score | WA on #01
801044
sun7楼主2024/8/13 15:43

蒟蒻求助:只有第一个点wa了,其他点都AC了

思路:

a0是原表,b0是目标表。对于一个点,如果目标图上也有一个相同的点,那一定这个点不移动最优,所以我们只用看原表和目标图上不同的点。在输入inchange中,用a存原位置,b存目标位置。dfs的k表示当前是第k个目标位置,sum表示总步数

#include<bits/stdc++.h>

using namespace std;

int a0[7][7]{0};
int b0[7][7]{0};
long long len=INT_MAX;
int ai=0,bi=0;
struct node{
	int x,y;
}a[20],b[20];
int visa[20]{0};

inline void dfs(int k,long long sum){//bi,len
	if(k>bi){
		len=min(len,sum);
		return ;
	}
	
	for(int i=1;i<=ai;i+=1){
		if(visa[i]) continue;
		visa[i]=1;
		dfs(k+1,sum+abs(a[i].x-b[k].x)+abs(a[i].y-b[k].y));
		visa[i]=0;
	}
}
inline void inchange(void){
	char mid;
	for(int i=1;i<=4;i+=1){
		for(int j=1;j<=4;j+=1){
			cin>>mid;
			a0[i][j]=mid-'0';
		}
	}
	for(int i=1;i<=4;i+=1){
		for(int j=1;j<=4;j+=1){
			cin>>mid;
			b0[i][j]=mid-'0';
			//if(a0[i][j]==b0[i][j]) a0[i][j]=0,b0[i][j]=0;
			if(a0[i][j]==0&&b0[i][j]==1) b[++bi].x=i,b[++bi].y=j;
			else if(b0[i][j]==0&&a0[i][j]==1) a[++ai].x=i,a[++ai].y=j;
		}
	}
}
int main(void){

	inchange();
	dfs(1,0);
	cout<<len;

	return 0;
}

谢谢大佬~~ 给大佬递茶

2024/8/13 15:43
加载中...