zoukankan      html  css  js  c++  java
  • BZOJ 1085(IDA*)

    题面

    传送门

    分析

    首先,直接搜索肯定会TLE
    很容易想到用迭代加深的方法,限定搜索深度
    但是,这样仍然不够,需要用启发式的方法优化
    我们设计一个估价函数f(x)=g(x)+h(x)f(x)=g(x)+h(x)
    g(x)g(x)是初始状态到当前状态的实际代价
    h(x)h(x)是当前到目标的估计代价
    如果f(x)=g(x)+h(x)>df(x)=g(x)+h(x)>d(当前限定深度),则直接返回
    h(x)h(x)函数如何设计?
    h(x)h(x)不能劣于实际最优值,所以可设为当前状态与目标状态不同方格的数量

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define maxn 16
    using namespace std;
    int n=5;
    int walkx[10]= {1,1,-1,-1,2,2,-2,-2};
    int walky[10]= {2,-2,2,-2,1,-1,1,-1};
    char now[maxn][maxn];
    char final[maxn][maxn]= {{},{' ','1','1','1','1','1'},{' ','0','1','1','1','1'},{' ','0','0','*','1','1'},{' ','0','0','0','0','1'},{' ','0','0','0','0','0'}};
    int is_same() {
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=n; j++) {
                if(now[i][j]!=final[i][j]) return 0;
            }
        }
        return 1;
    }
    int h() { //估价函数
        int cnt=0;
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=n; j++) {
                if(now[i][j]!=final[i][j]) cnt++;
            }
        }
        return cnt;
    }
    int ida(int deep,int limit,int x,int y) {
    //  printf("%d %d %d %d
    ",deep,dasadfslimit,x,y);
    //  for(int i=1; i<=n; i++) {
    //      for(int j=1; j<=n; j++) {
    //          printf("%c",now[i][j]);
    //      }
    //      printf("
    ");
    //  }
    //  printf("
    ");
        if(deep>limit) return 0;
        if(deep==limit) {
            if(is_same()) {
    //          for(int i=1; i<=n; i++) {
    //              for(int j=1; j<=n; j++) {
    //                  printf("%c",now[i][j]);
    //              }
    //              printf("
    ");
    //          }
                return 1;
            } else return 0;
        }
        int flag=0;
        for(int i=0; i<8; i++) {
            int xx=x+walkx[i],yy=y+walky[i];
            if(xx<1||yy<1||xx>n||yy>n) continue;
            swap(now[x][y],now[xx][yy]);
            if(deep+h()<=limit) flag|=ida(deep+1,limit,xx,yy);
            swap(now[x][y],now[xx][yy]);
        }
        return flag;
    }
    int t;
    int main() {
        scanf("%d",&t);
        while(t--) {
            int sx,sy;
            for(int i=1; i<=5; i++) {
                for(int j=1; j<=5; j++) {
                    cin>>now[i][j];
                    if(now[i][j]=='*') {
                        sx=i;
                        sy=j;
                    }
                }
            }
    //      for(int i=1; i<=n; i++) {
    //          for(int j=1; j<=n; j++) {
    //              printf("%c",final[i][j]);
    //          }
    //          printf("
    ");
    //      }
            for(int i=0; i<=16; i++) {
                if(i==16) {
                    printf("-1
    ");
                    break;
                }
                if(ida(0,i,sx,sy)) {
                    printf("%d
    ",i);
                    break;
                }
            }
        }
    }
  • 相关阅读:
    mysql 语句的查询过程解析
    postman 百度网盘下载 64位
    java 读取文内容(text,html)
    java把Word文件转成html的字符串返回出去
    spring boot 2.X上传文件限制大小
    nginx 做反向代理
    Linux下安装Redis
    微信小程序云开发个人博客项目实战(2)---引入-Vant-Weapp-小程序-UI-组件库
    微信小程序云开发个人博客项目实战(1)- 准备工作及引入 Vant Weapp 小程序 UI 组件库
    Video 视频播放防作弊和禁止下载
  • 原文地址:https://www.cnblogs.com/birchtree/p/9845828.html
Copyright © 2011-2022 走看看