【BZOJ】1085 [SCOI2005]骑士精神(IDA*)

题目

传送门:QWQ

分析

我好菜啊。

一波IDA*水过去了。

代码

#include <bits/stdc++.h>
using namespace std; const int maxn = ;
char s[maxn][maxn];
int a[maxn][maxn], res=;;
int dx[]={,-,-,,,-,-,}, dy[]={,,-,-,,,-,-};
int ans[maxn][maxn]=
{
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,}
}; int in(int x,int y) { return x>=&&y>=&&x<=&&y<=; }
int check() {
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(a[i][j]!=ans[i][j]) return ;
return ;
}
int g() {
int tot=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(a[i][j]!=ans[i][j]) tot++;
return tot;
}
void Astar(int x,int y,int depth,int limit) {
if(depth==limit) {
if(check()) res=limit;
return;
}
for(int i=;i<;i++) {
int px=x+dx[i], py=y+dy[i];
if(!in(px,py)) continue;
swap(a[px][py], a[x][y]);
if(g()+depth <= limit) Astar(px,py,depth+,limit);
swap(a[px][py], a[x][y]);
}
}
int main() {
int sx,sy,t;
scanf("%d",&t);
while(t--) {
res=;
for(int i=;i<=;i++)
scanf("%s",s[i]+); for(int ii=;ii<=;ii++) {
for(int i=;i<=;i++)
for(int j=;j<=;j++) {
if(s[i][j]=='') a[i][j]=;
else if(s[i][j]=='') a[i][j]=;
else {
sx=i; sy=j; a[i][j]=;
}
}
Astar(sx,sy,,ii);
if(res) break;
}
if(!res) res--;
printf("%d\n",res);
}
return ;
}
上一篇:【MySQL】MySQL无基础学习和入门大纲


下一篇:Object的wait()/notify()