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;
}

浙公网安备 33010602011771号