50pts WA#2#5#8#9#10求调
查看原帖
50pts WA#2#5#8#9#10求调
1030876
dhlzzsx楼主2024/8/21 11:24

样例可过,悬关

#include<cstdio>
#include<queue>
using namespace std;
const int Swap[24][2]={{16,15},{15,14},{14,13},{12,11},{11,10},{10,9},{8,7},{7,6},{6,5},{4,3},{3,2},{2,1},{16,12},{12,8},{8,4},{15,11},{11,7},{7,3},{14,10},{10,6},{6,2},{13,9},{9,5},{5,1}};
const int N=16;
const int INF=0x7fffffff;
queue<int> que;
int step[1<<N];
int start,endd;
int Bit(int x,int k){
	return (x>>(k-1))&1;
}
int Num(int k){
	return 1<<(k-1);
}
void Bfs(){
	que.push(start);
	for(int i=0;i<(1<<N);i++)
		step[i]=INF;
	step[start]=0;
	while(!que.empty()){
		int now=que.front();
		que.pop();
		if(now==endd){
			printf("%d",step[endd]);
			return;
		}
		for(int k=0;k<24;k++){
			int next=now^Num(Swap[k][0])^Num(Swap[k][1]);
			if(step[now]+1<step[next]){
				que.push(next);
				step[next]=step[now]+1;
			}
		}
	}
}
int main(){
//	freopen("P4289.in","r",stdin);
//	freopen("P4289.out","w",stdout);
	for(int i=1,x;i<=16;i++){
		scanf("%1d",&x);
		start=(start<<1)+x;
	}
	for(int i=1,x;i<=16;i++){
		scanf("%1d",&x);
		endd=(endd<<1)+x;
	}
	Bfs();
	return 0;
}
2024/8/21 11:24
加载中...