20pts求调
查看原帖
20pts求调
517320
CyaNgw_DyG楼主2022/8/27 08:21
#include<bits/stdc++.h>
using namespace std;
struct doge {
	string now,ans;
	int cnt;
} k,t; //now为当前状态,cnt为步数
string s,CyaNgw;
int dis[100]= {2,5,  3,6,  4,7,  8,
               6,9,  7,10,  8,11,  12,
               10,13,  11,14,  12,15,  11,16,
               14,  15,  16
              };//每个点对应的方向
int Q;
int cnt[20]= {0,2,4,6,7  ,9,11,13,14,  16,18,20,22,  23,24,25}; //用于扩散BFS
queue<doge>q;
string did[20]= {"0","1","2","3","4"};
map <string,bool > vis;
main() {
	for(int i=1; i<=4; i++)cin>>s,k.now+=s;
	for(int i=1; i<=4; i++)cin>>s,CyaNgw+=s; //CyaNgw是目标
	q.push(k);
	while(!q.empty()) {
		k=q.front();
		q.pop();
		k.cnt++;
		for(int x=1; x<=4; x++)
			for(int y=0; y<=3; y++) {
				Q=(x-1)*4+y;//二维转1维,也可以直接0~15的循环,但这样两层循环方便另外那个题的记录交换步骤
				for(int i=cnt[Q]; i<=cnt[Q+1]-1; i++) { //从cnt[Q]~cnt[Q+1]-1也就是循环Q这个点的所有方向
					t=k;
					if(t.now[Q]!=t.now[dis[i]-1]) { //剪枝
						swap(t.now[Q],t.now[dis[i]-1]) ;//[Q]和dis[i]交换
						if(!vis[t.now]) {
							vis[t.now]=1;
							//////////////////////
							t.ans+=did[x]+did[y+1];
							if(abs(dis[i]-1-Q)==0)
								t.ans+=did[x+1]+did[y+1];
							else
								t.ans+=did[x]+did[y+2];
							/////////////////////////////
							q.push(t);

						}
					}
				}
			}
		if(k.now==CyaNgw) { //如果达到目标
			cout<<k.cnt-1;
			for(int i=0; i<k.ans.length(); i++) {
				if(i%4==0)cout<<endl;
				cout<<k.ans[i];
			}
			return 0;
		}
	}
}
/*  $ 4 \times 4 $ 的矩阵
1  2   3   4
5  6   7   8
9 10  11  12
13 14 15  16
*/


2022/8/27 08:21
加载中...