蒟蒻求助:只有第一个点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;
}
谢谢大佬~~ 给大佬递茶