有没有人使用meet in the middle通过了此题?本人代码样例TLE,
查看原帖
有没有人使用meet in the middle通过了此题?本人代码样例TLE,
1309682
majoego楼主2024/3/16 16:19
// Author: gsczl71
// Copyright (c) 2024 gsczl71 All rights reserved.
// Problem: P2324 [SCOI2005] 骑士精神
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2324
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2024-03-16 14:23:05

#include<bits/stdc++.h>
#define ll long long
#define i128 __int128
#define ull unsigned long long
#define pii pair<int,int>
#define pll pair<long long, long long>
#define fs first
#define sc second
#define endl '\n'
#define debug puts("AK IOI")
#define re register
#define pb push_back
#define mem(a,x) memset((a),(x),sizeof(a))
#define vi vector<int>
#define pq priority_queue
using namespace std;
//#define int long long
const int mod = 1e9+7;
//const int mod = 998244353;
const int inf = 0x3f3f3f3f,N = 15,M = 1e6+5,K = 3000+5;
const long long linf = 0x3f3f3f3f3f3f3f3f;
int n=5;
char a[N][N];
vector<char> st,ed;
int d[8] = {-11,-9,-7,-3,3,7,9,11};
int ans=1e9;
map<vector<char>,int> mp;
map<vector<char>,int> mp2;
void dfs1(int x,int res,vector<char> v){
	if(res > 8) return ;
	if(mp.count(v)) mp[v]=min(mp[v],res);
	else mp[v]=res;
	for(int i = 0; i < 8;i++){
		int nw = x + d[i];
		if(nw >= 0 && nw < 25){
			swap(v[x],v[nw]);
			dfs1(nw,res+1,v);
			swap(v[x],v[nw]);
		}
	}
}void dfs2(int x,int res,vector<char> v){
	if(res > 8) return ;
	if(mp2.count(v)) mp2[v]=min(mp2[v],res);
	else mp2[v]=res;
	if(mp.count(v)) ans = min(ans,mp2[v] + mp[v]);
	for(int i = 0; i < 8;i++){
		int nw = x + d[i];
		if(nw >= 0 && nw < 25){
			swap(v[x],v[nw]);
			dfs2(nw,res+1,v);
			swap(v[x],v[nw]);
		}
	}
}
void solve(){
	ans = 1e9;
	int xx=0,yy=0;
	for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++){cin >> a[i][j];st.pb(a[i][j]);if(a[i][j]=='*')xx=yy;yy++;}
	for(int i = 1;i <= n;i++) st.pb('1');
	st.pb('0');for(int i = 1;i <= 4;i++) st.pb('1');
	for(int i = 1;i <= 2;i++) st.pb('0');st.pb('*');for(int i = 1;i <= 2;i++) st.pb('1');
	for(int i =1;i <= 4;i++) st.pb('0');st.pb('1');
	for(int i = 1;i <= 5;i++) st.pb('0');
	
	dfs1(xx,0,st);
	dfs2(12,0,ed);
	
	cout<<ans<<endl;
}
signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int T=1;
	cin >> T;
	while(T--) solve();
	return 0;
}
2024/3/16 16:19
加载中...