A*搜索学习笔记

P1379 八数码难题

\(A*\) ,没啥可说的,直接 \(A*\) 做就行。

代码

#include <bits/stdc++.h>
using namespace std;

#define For(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<=(y);++i)
#define foR(i,x,y,...) for(int i=(x),##__VA_ARGS__;i>=(y);--i)
#define Rep(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<(y);++i)
#define endl '\n'
#define debug(...)
#define debug1(a,i,...) cout<<i<<" "<<a[i]<<endl;
typedef long long ll;
#define fi first
#define se second
#define PII pair<int,int>
#define me(s,x) memset(s,x,sizeof s)
#define pb emplace_back

template<typename T=int>T read(){T x;cin>>x;return x;}
const int mod=998244353;
struct mint{
	int x;mint(int x=0):x(x<0?x+mod:x<mod?x:x-mod){}
	mint(ll y){y%=mod,x=y<0?y+mod:y;}
	mint& operator += (const mint &y){x=x+y.x<mod?x+y.x:x+y.x-mod;return *this;}
	mint& operator -= (const mint &y){x=x<y.x?x-y.x+mod:x-y.x;return *this;}
	mint& operator *= (const mint &y){x=1ll*x*y.x%mod;return *this;}
	friend mint operator + (mint x,const mint &y){return x+y;}
	friend mint operator - (mint x,const mint &y){return x-y;}
	friend mint operator * (mint x,const mint &y){return x*y;}
};mint Pow(mint x,ll y=mod-2){mint z(1);for(;y;y>>=1,x*=x)if(y&1)z*=x;return z;}
struct matrix{
	int a[5][5];
	bool operator<(matrix x)const{
		For(i,1,3)For(j,1,3) if(a[i][j]!=x.a[i][j])return a[i][j]<x.a[i][j];
		return 0;
	}
}st,f;
int h(matrix a){
	int res=0;
	For(i,1,3)For(j,1,3) if(a.a[i][j]&&a.a[i][j]!=st.a[i][j]) res++;
	return res;
}
struct no{
	matrix a;
	int t;
	bool operator < (no x) const{
		return t+h(a)>x.t+h(x.a);
	}
};
int dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
priority_queue<no> q;
set<matrix> s;
int Astar(){
	q.push({f,0});s.insert(f);
	while(!q.empty()){
		no k=q.top();q.pop();
		if(!h(k.a)) return k.t;
		int x,y;
		For(i,1,3)For(j,1,3){
			if(!k.a.a[i][j]){
				x=i,y=j;
				break;
			}
		}
		For(i,1,4){
			int nx=x+dx[i],ny=y+dy[i];
			if(nx>=1&&nx<=3&&ny>=1&&ny<=3){
				swap(k.a.a[x][y],k.a.a[nx][ny]);
				if(!s.count(k.a)){
					s.insert(k.a);
					q.push({k.a,k.t+1});
				}	
				swap(k.a.a[x][y],k.a.a[nx][ny]);
			}
			
		}
	}
	return -1;
}
void MAIN(){
	st.a[1][1]=1,st.a[1][2]=2,st.a[1][3]=3,st.a[2][1]=8,st.a[2][2]=0,st.a[2][3]=4,st.a[3][1]=7,st.a[3][2]=6,st.a[3][3]=5;
	For(i,1,3)For(j,1,3){
		char c;
		cin>>c;
		f.a[i][j]=c-'0';
	}
	cout<<Astar()<<endl;
}signed main(){
	int t=1;while(t--){
		MAIN();
	}
	return 0;
}

P2324 [SCOI2005] 骑士精神

20pts代码:

#include <bits/stdc++.h>
using namespace std;

#define For(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<=(y);++i)
#define foR(i,x,y,...) for(int i=(x),##__VA_ARGS__;i>=(y);--i)
#define Rep(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<(y);++i)
#define endl '\n'
#define debug(...)
#define debug1(a,i,...) cout<<i<<" "<<a[i]<<endl;
typedef long long ll;
#define fi first
#define se second
#define PII pair<int,int>
#define me(s,x) memset(s,x,sizeof s)
#define pb emplace_back

template<typename T=int>T read(){T x;cin>>x;return x;}
const int mod=20140921;
struct mint{
	int x;mint(int x=0):x(x<0?x+mod:x<mod?x:x-mod){}
	mint(ll y){y%=mod,x=y<0?y+mod:y;}
	mint& operator += (const mint &y){x=x+y.x<mod?x+y.x:x+y.x-mod;return *this;}
	mint& operator -= (const mint &y){x=x<y.x?x-y.x+mod:x-y.x;return *this;}
	mint& operator *= (const mint &y){x=1ll*x*y.x%mod;return *this;}
	friend mint operator + (mint x,const mint &y){return x+y;}
	friend mint operator - (mint x,const mint &y){return x-y;}
	friend mint operator * (mint x,const mint &y){return x*y;}
};mint Pow(mint x,ll y=mod-2){mint z(1);for(;y;y>>=1,x*=x)if(y&1)z*=x;return z;}
int n=5;
struct matrix{
	int a[10][10];
	bool operator < (const matrix&x)const{
		For(i,1,n)For(j,1,n) if(a[i][j]!=x.a[i][j]) return a[i][j]<x.a[i][j];
		return 0;
	}
}go,a;
int h(matrix f){
	int res=0;
	For(i,1,n)For(j,1,n) res+=f.a[i][j]!=go.a[i][j]&&f.a[i][j]!=-1;
	return res;
}
struct no{
	matrix a;
	int t;
	bool operator <(const no & x)const{
		return t+h(a)>x.t+h(x.a);
	}
};
int dx[]={0,-2,-2,-1,-1,1,1,2,2},dy[]={0,-1,1,-2,2,-2,2,-1,1};
priority_queue<no> q;
set<matrix> s;
int Astar(){
	q.push({a,0}),s.insert(a);
	while(!q.empty()){
		no x=q.top();q.pop();
		if(x.t>15){
			return -1;
		}
		if(!h(x.a)) return x.t;
		int sx=0,sy=0;
		For(i,1,n)For(j,1,n)if(x.a.a[i][j]==-1){sx=i,sy=j;break;}
		For(i,1,8){
			int nx=sx+dx[i],ny=sy+dy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=n){
				swap(x.a.a[sx][sy],x.a.a[nx][ny]);
				if(!s.count(x.a)){
					s.insert(x.a);
					q.push({x.a,x.t+1});
				}
				swap(x.a.a[sx][sy],x.a.a[nx][ny]);
			}
		}
	}
	return -1;
}
void MAIN(){
	while(!q.empty()) q.pop();
	For(i,1,n)For(j,1,n){
		char c;
		cin>>c;
		if(c=='*') a.a[i][j]=-1;
		else a.a[i][j]=c-'0';
	}
	cout<<Astar()<<endl;
}signed main(){
	go.a[1][1]=1,go.a[1][2]=1,go.a[1][3]=1,go.a[1][4]=1,go.a[1][5]=1;
	go.a[2][1]=0,go.a[2][2]=1,go.a[2][3]=1,go.a[2][4]=1,go.a[2][5]=1;
	go.a[3][1]=0,go.a[3][2]=0,go.a[3][3]=-1,go.a[3][4]=1,go.a[3][5]=1;
	go.a[4][1]=0,go.a[4][2]=0,go.a[4][3]=0,go.a[4][4]=0,go.a[4][5]=1;
	go.a[5][1]=0,go.a[5][2]=0,go.a[5][3]=0,go.a[5][4]=0,go.a[5][5]=0;
	int t=read();while(t--){
		MAIN();
	}
	return 0;
}

看了半天原来是set没清空。。。

100pts(比20的加个 \(s.clear()\) 就行了):

#include <bits/stdc++.h>
using namespace std;

#define For(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<=(y);++i)
#define foR(i,x,y,...) for(int i=(x),##__VA_ARGS__;i>=(y);--i)
#define Rep(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<(y);++i)
#define endl '\n'
#define debug(...)
#define debug1(a,i,...) cout<<i<<" "<<a[i]<<endl;
typedef long long ll;
#define fi first
#define se second
#define PII pair<int,int>
#define me(s,x) memset(s,x,sizeof s)
#define pb emplace_back

template<typename T=int>T read(){T x;cin>>x;return x;}
const int mod=20140921;
struct mint{
	int x;mint(int x=0):x(x<0?x+mod:x<mod?x:x-mod){}
	mint(ll y){y%=mod,x=y<0?y+mod:y;}
	mint& operator += (const mint &y){x=x+y.x<mod?x+y.x:x+y.x-mod;return *this;}
	mint& operator -= (const mint &y){x=x<y.x?x-y.x+mod:x-y.x;return *this;}
	mint& operator *= (const mint &y){x=1ll*x*y.x%mod;return *this;}
	friend mint operator + (mint x,const mint &y){return x+y;}
	friend mint operator - (mint x,const mint &y){return x-y;}
	friend mint operator * (mint x,const mint &y){return x*y;}
};mint Pow(mint x,ll y=mod-2){mint z(1);for(;y;y>>=1,x*=x)if(y&1)z*=x;return z;}
int n=5;
struct matrix{
	int a[10][10];
	bool operator < (const matrix&x)const{
		For(i,1,n)For(j,1,n) if(a[i][j]!=x.a[i][j]) return a[i][j]<x.a[i][j];
		return 0;
	}
}go,a;
int h(matrix f){
	int res=0;
	For(i,1,n)For(j,1,n) res+=f.a[i][j]!=go.a[i][j]&&f.a[i][j]!=-1;
	return res;
}
struct no{
	matrix a;
	int t;
	bool operator <(const no & x)const{
		return t+h(a)>x.t+h(x.a);
	}
};
int dx[]={0,-2,-2,-1,-1,1,1,2,2},dy[]={0,-1,1,-2,2,-2,2,-1,1};
priority_queue<no> q;
set<matrix> s;
int Astar(){
	q.push({a,0}),s.insert(a);
	while(!q.empty()){
		no x=q.top();q.pop();
		if(x.t>15){
			return -1;
		}
		if(!h(x.a)) return x.t;
		int sx=0,sy=0;
		For(i,1,n)For(j,1,n)if(x.a.a[i][j]==-1){sx=i,sy=j;break;}
		For(i,1,8){
			int nx=sx+dx[i],ny=sy+dy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=n){
				swap(x.a.a[sx][sy],x.a.a[nx][ny]);
				if(!s.count(x.a)){
					s.insert(x.a);
					q.push({x.a,x.t+1});
				}
				swap(x.a.a[sx][sy],x.a.a[nx][ny]);
			}
		}
	}
	return -1;
}
void MAIN(){
	while(!q.empty()) q.pop();
	s.clear();
	For(i,1,n)For(j,1,n){
		char c;
		cin>>c;
		if(c=='*') a.a[i][j]=-1;
		else a.a[i][j]=c-'0';
	}
	cout<<Astar()<<endl;
}signed main(){
	go.a[1][1]=1,go.a[1][2]=1,go.a[1][3]=1,go.a[1][4]=1,go.a[1][5]=1;
	go.a[2][1]=0,go.a[2][2]=1,go.a[2][3]=1,go.a[2][4]=1,go.a[2][5]=1;
	go.a[3][1]=0,go.a[3][2]=0,go.a[3][3]=-1,go.a[3][4]=1,go.a[3][5]=1;
	go.a[4][1]=0,go.a[4][2]=0,go.a[4][3]=0,go.a[4][4]=0,go.a[4][5]=1;
	go.a[5][1]=0,go.a[5][2]=0,go.a[5][3]=0,go.a[5][4]=0,go.a[5][5]=0;
	int t=read();while(t--){
		MAIN();
	}
	return 0;
}

P2534 [AHOI2012] 铁盘整理

怎么这个A*写得不太一样啊

代码:

#include <bits/stdc++.h>
using namespace std;

#define For(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<=(y);++i)
#define foR(i,x,y,...) for(int i=(x),##__VA_ARGS__;i>=(y);--i)
#define Rep(i,x,y,...) for(int i=(x),##__VA_ARGS__;i<(y);++i)
#define endl '\n'
#define debug(...)
#define debug1(a,i,...) cout<<i<<" "<<a[i]<<endl;
typedef long long ll;
#define fi first
#define se second
#define PII pair<int,int>
#define me(s,x) memset(s,x,sizeof s)
#define pb emplace_back

template<typename T=int>T read(){T x;cin>>x;return x;}
const int mod=20140921;
struct mint{
	int x;mint(int x=0):x(x<0?x+mod:x<mod?x:x-mod){}
	mint(ll y){y%=mod,x=y<0?y+mod:y;}
	mint& operator += (const mint &y){x=x+y.x<mod?x+y.x:x+y.x-mod;return *this;}
	mint& operator -= (const mint &y){x=x<y.x?x-y.x+mod:x-y.x;return *this;}
	mint& operator *= (const mint &y){x=1ll*x*y.x%mod;return *this;}
	friend mint operator + (mint x,const mint &y){return x+y;}
	friend mint operator - (mint x,const mint &y){return x-y;}
	friend mint operator * (mint x,const mint &y){return x*y;}
};mint Pow(mint x,ll y=mod-2){mint z(1);for(;y;y>>=1,x*=x)if(y&1)z*=x;return z;}
const int N=20;
int a[N],b[N];
int n,m;
bool fl=0;
int h(){
	int res=0;
	For(i,1,n) res+=abs(a[i]-a[i+1])!=1;
	return res; 
}
void dfs(int u,int fa){
	if(!h())fl=1;
	if(fl||u+h()>m) return;
	For(i,1,n){
		if(i==fa) continue;
		reverse(a+1,a+i+1);
		dfs(u+1,i);
		reverse(a+1,a+i+1);
	}
}
void MAIN(){
	cin>>n;
	For(i,1,n) cin>>a[i],b[i]=a[i];
	a[n+1]=n+1;
	sort(b+1,b+n+1);
	For(i,1,n){
		a[i]=lower_bound(b+1,b+n+1,a[i])-b;
	}
	for(;;++m){
		dfs(0,0);
		if(fl){
			cout<<m<<endl;
			exit(0); 
		}
	}
}signed main(){
	int t=1;while(t--){
		MAIN();
	}
	return 0;
}
posted @ 2025-04-28 22:59  cruisexsy2011  阅读(9)  评论(0)    收藏  举报