BZOJ 1085: [SCOI2005]骑士精神(A*算法)

时间:2021-02-16 10:10:41

第一次写A*算法(这就是A*?如果这就是A*的话,那不就只是搜索的一个优化了= =,不过h函数如果弄难一点真的有些难设计)

其实就是判断t+h(x)(t为当前步数,h(x)为达到当前状态的最小步数) 是否小于当前答案k罢了

已经连续几道题因为一些小问题而调了很久了,不能这样啊QAQ

CODE:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int ans[5][5]={{1,1,1,1,1},{0,1,1,1,1},{0,0,2,1,1},{0,0,0,0,1},{0,0,0,0,0}};
int xx[8]={1,-1,2,-2,1,-1,2,-2};
int yy[8]={2,2,1,1,-2,-2,-1,-1};
int a[5][5];
int k=16;
int judge(int a[5][5]){
 for (int i=0;i<5;i++)
 for (int j=0;j<5;j++)
  if (a[i][j]!=ans[i][j]) return 0;
 return 1;
}
int eva(int a[5][5],int t){
 int l=0;
 for (int i=0;i<5;i++)
 for (int j=0;j<5;j++)
  if (a[i][j]!=ans[i][j]) l++;
 if (l+t>=k) return 0;
 return 1;
}
bool flag;
int search(int t,int a[5][5],int x,int y){
 if (t>=k) return 0;
 if (judge(a)) {flag=1;k=min(k,t);return 0;}
 for (int i=0;i<8;i++){
  int nowx=x+xx[i],nowy=y+yy[i];
  if (nowx>=0&&nowx<5&&nowy>=0&&nowy<5) {
   swap(a[x][y],a[nowx][nowy]);
   if (eva(a,t)) search(t+1,a,nowx,nowy);
   swap(a[x][y],a[nowx][nowy]);
  }
 }
 return 0;
}
int main(){
 int t,x,y;
 scanf("%d",&t);
 while (t--){
  flag=0;k=16;
  for (int i=0;i<5;i++) {
   char c[10];
   scanf("%s",c);
   for (int j=0;j<5;j++) {
   if (c[j]=='0') a[i][j]=0;
   if (c[j]=='1') a[i][j]=1;
   if (c[j]=='*') {a[i][j]=2;x=i;y=j;}
  }
  }
  search(0,a,x,y);
  if (flag) printf("%d\n",k);
  else printf("-1\n");
 }
 return 0;
}