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


    第一次写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 ",k);
      else printf("-1 ");
     }
     return 0;
    }

  • 相关阅读:
    python
    在liunx环境下安装python
    解决用navicate远程连接数据库出现1045
    mysql的监控及优化
    mysql基础
    linux基础学习
    Effective c++ 第一章 让自己习惯C++
    读前感
    socket编程:客户端与服务器间的连接以及各函数的用法
    生成任意区间的随机数
  • 原文地址:https://www.cnblogs.com/New-Godess/p/4348931.html
Copyright © 2020-2023  润新知