• poj2286The Rotation Game(迭代加深dfs)


    链接

    把迭代加深理解错了 自己写了半天也没写对

    所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索。这种方法虽然会导致重复的遍历 某些结点,但是由于搜索的复杂度是呈指数级别增加的,所以对于下一层搜索,前面的工作可以忽略不计,因而不会导致时间上的亏空。

    IDA*就是一个加了层数限制depth的DFS,超过了限制就不在搜索下去,如果在当前层数没有搜到目标状态,就加大层数限制depth,这里还只是一个IDA算法,并不是A*的。当然我们可以用A*的估计函数去剪枝,如果当前深度d+h()>depth的时候就可以不再搜索下去了,这样就是IDA*了。

    具体 代码里有注释

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 using namespace std;
     7 int a[25];
     8 int p[8] = {6,7,8,11,12,15,16,17};//中间8个所对应的序号
     9 int rev[8] = {5,4,7,6,1,0,3,2};//A-F B-E...反着移动
    10 int v,ans[110];
    11 int po[8][7] = {0,2,6,11,15,20,22,
    12             1,3,8,12,17,21,23,
    13             10,9,8,7,6,5,4,
    14             19,18,17,16,15,14,13,
    15             23,21,17,12,8,3,1,
    16             22,20,15,11,6,2,0,
    17             13,14,15,16,17,18,19,
    18             4,5,6,7,8,9,10};//8种操作的原始顺序 对应ABCDEFGH
    19 void change(int k)//操作一次的结果
    20 {
    21     int i,y = a[po[k][0]];
    22     for(i = 0 ; i < 6 ; i++)
    23     a[po[k][i]] = a[po[k][i+1]];
    24     a[po[k][6]] = y;
    25 }
    26 int fdep()//这个是简单的估计下还需要搜得层数 假如中间已经有5个相同的了 那最少还要移3次
    27 {
    28     int i,x[4] = {0,0,0,0};
    29     for(i = 0 ; i < 8 ; i++)
    30     x[a[p[i]]]++;
    31     int an=0;
    32     for(i = 1 ; i < 4 ; i++)
    33     an = max(an,x[i]);
    34     return 8-an;
    35 }
    36 int dfs(int depth)
    37 {
    38     int i,tt;
    39     for(i = 0 ; i < 8 ; i++)
    40     {
    41         change(i);//操作
    42         tt = fdep();
    43         if(tt==0)//已经到达目的解
    44         {
    45             ans[depth] = i;
    46             return 1;
    47         }
    48         if(depth+tt<v)//如果没有超过层数限制
    49         {
    50             ans[depth] = i;
    51             if(dfs(depth+1))
    52             return 1;
    53         }
    54         change(rev[i]);//撤销操作
    55     }
    56     return 0;
    57 }
    58 int main()
    59 {
    60     int i;
    61     while(scanf("%d",&a[0])&&a[0])
    62     {
    63         for(i = 1 ; i < 24 ; i++)
    64         scanf("%d",&a[i]);
    65         if(fdep()==0)
    66         {
    67             puts("No moves needed");
    68             printf("%d
    ",a[17]);//这里不要忘了输出
    69             continue;
    70         }
    71         v = 1;
    72         while(!dfs(0))
    73         {
    74             v++;
    75         }
    76         for(i = 0 ; i < v ; i++)
    77         printf("%c",ans[i]+'A');
    78         puts("");
    79         printf("%d
    ",a[15]);
    80     }
    81     return 0;
    82 }
    View Code
  • 相关阅读:
    MongoDB
    uni-app同步缓存值 设置 读取 删除
    uni-app路由跳转
    uni-app在小程序上遇见的坑(a-b页面频繁跳转)
    unia-app页面生命周期详解
    uni-app之页面跳转(点击按钮进行页面跳转)
    02如何直接使用uni-app中提供的模板之公告滚动
    01-组件轮播
    uni-app如何只用插件市场中的插件
    uni-app在线引入阿里字体图标库
  • 原文地址:https://www.cnblogs.com/shangyu/p/3286106.html
Copyright © 2020-2023  润新知