朴素DBFS(80分),#4,#7WA了,不是很理解
查看原帖
朴素DBFS(80分),#4,#7WA了,不是很理解
1128556
jayket楼主2023/12/22 18:18
#include<bits/stdc++.h>
using namespace std;
const int dir[8][2]={1,2,2,1,2,-1,1,-2,-1,-2,-2,-1,-2,1,-1,2};

void solve(){
    unordered_map<string,int>dis;
    unordered_map<string,int>vis;
    string ans="111110111100*110000100000";//正序设为1,逆序设为2
    string cur;
	char c;
	for(int i=1;i<=25;++i){
		cin>>c;cur+=c;
	}
	if(cur==ans){
        cout<<"0\n";
        return;
	}
	queue<string>q;
	vis[cur]=1,vis[ans]=2;
	dis[cur]=0,dis[ans]=0;
	q.push(cur);
	q.push(ans);
	while(q.size()){
        string now=q.front();q.pop();
        char grid[6][6];
        int k=0;
        int x,y;
        for(int i=1;i<=5;++i){
            for(int j=1;j<=5;++j){
                if(now[k]=='*'){
                    x=i,y=j;
                }
                grid[i][j]=now[k++];
            }
        }
        for(int i=0;i<8;++i){
            int u=x+dir[i][0];
            int v=y+dir[i][1];
            if(u<1||u>5||v<1||v>5)continue;
            swap(grid[x][y],grid[u][v]);
            string temp="";
            for(int i=1;i<=5;++i){
                for(int j=1;j<=5;++j){
                    temp+=grid[i][j];
                }
            }
            if(vis[temp]==vis[now]){
                swap(grid[x][y],grid[u][v]);
                continue;
            }
            if(vis[temp]+vis[now]==3){
                cout<<((dis[temp]+dis[now])<=15?(dis[temp]+dis[now]+1):-1)<<"\n";
                return;
            }
            vis[temp]=vis[now];
            dis[temp]=dis[now]+1;
            q.push(temp);
            swap(grid[x][y],grid[u][v]);
        }
	}
}
int main(void){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int _;cin>>_;
	while(_--){
        solve();
	}
	return 0;
}

2023/12/22 18:18
加载中...