博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2286 The Rotation Game 迭代加深
阅读量:5084 次
发布时间:2019-06-13

本文共 1425 字,大约阅读时间需要 4 分钟。

今天又做了个迭代加深,不错继续努力!!
     移动八根线中任一根,移法为头的数移到线的尾,其它的数向头进一位。求最少要移多少次才能使中间的八个数相等。
本题若用广搜,空间需求量非常大,空间不足。深搜的话,深度很难控制,容易陷入死循环。在这个时候就要用到迭代加深的深搜方法。

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

这种方法,可以算作是DFS和BFS的结合。适合大树而可行解不是很深的题目。

#include<stdio.h>

int ff[8][7]={0,2,6,11,15,20,22,
            1,3,8,12,17,21,23,
            10,9,8,7,6,5,4,
            19,18,17,16,15,14,13,
            23,21,17,12,8,3,1,
            22,20,15,11,6,2,0,
            13,14,15,16,17,18,19,
            4,5,6,7,8,9,10};
int aim[8]={6,7,8,11,12,15,16,17};
int rev[8]={5,4,7,6,1,0,3,2};
int map[25],ans[20],DEPTH;
int least(){
    int i,count[3]={0,0,0},ans=0;
    for(i=0;i<8;++i)++count[map[aim[i]]-1];
    for(i=0;i<3;++i)if(ans<count[i])ans=count[i];
    return 8-ans;
}
int change(int dir){
    int i,temp=map[ff[dir][0]];
    for(i=0;i<6;++i)
        map[ff[dir][i]]=map[ff[dir][i+1]];
    map[ff[dir][6]]=temp;
}
int dfs(int depth){
    int i,temp;
    for(i=0;i<8;++i){
        change(i);
        if((temp=least())==0){
            ans[depth]=i;
            return depth+1;
        }
        if(depth+temp<DEPTH){
            ans[depth]=i;
            if(dfs(depth+1))return depth+1;
        }
        change(rev[i]);
    }
    return 0;
}
int main(){
    int i;
    while(scanf("%d",&map[0]),map[0]){
        for(i=1;i<24;++i)scanf("%d",&map[i]);
        if(least()==0){
            puts("No moves needed");
            printf("%d\n",map[6]);
            continue;
        }
        for(DEPTH=1;!dfs(0);++DEPTH);
        for(i=0;i<DEPTH;++i)printf("%c",ans[i]+'A');printf("\n");
        printf("%d\n",map[6]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/zxj015/archive/2011/04/12/2740240.html

你可能感兴趣的文章
BZOJ 1834网络扩容题解
查看>>
bzoj1878
查看>>
【Vegas原创】Mysql绿色版安装方法
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
分享《去哪儿网》前端笔试题
查看>>
2013-07-04学习笔记二
查看>>
CP15 协处理器寄存器解读
查看>>
【codeforces 787B】Not Afraid
查看>>
【9111】高精度除法(高精度除高精度)
查看>>
【hihocoder 1312】搜索三·启发式搜索(普通广搜做法)
查看>>
JavaFX中ObservableValue类型
查看>>
杭电 1097 A hard puzzle
查看>>
[转载]INFORMIX锁机制及如何剖析其锁申辩(第二部门)
查看>>
Andriod-项目stymqjlb-学习笔记2-原型
查看>>
Web AppDomain
查看>>
JQuery创建规范插件
查看>>
AD 域服务简介(三)- Java 对 AD 域用户的增删改查操作
查看>>
Unity中Text渐变色,和Text间距
查看>>
P4932 浏览器
查看>>
Concurrency Kit 0.2.13 发布,并发工具包
查看>>