| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4443 人关注过本帖
标题:八数码问题的迭代加深算法
只看楼主 加入收藏
rootkit
Rank: 1
等 级:新手上路
帖 子:197
专家分:5
注 册:2008-9-26
结帖率:100%
收藏
 问题点数:0 回复次数:39 
八数码问题的迭代加深算法
找出bug的有奖励

八数码问题是指一个3X3的9格棋盘上放置1到8这8个数字,多余一个空格,空格周围的数字可以移动到空格中
例如输入0,2,3,1,8,4,7,6,5这九个数(0表示空格位置),按输入顺序排列为setp 0,通过若干步移动就可以到达最终状态setp 2:
setp 0
0       2       3
1       8       4
7       6       5

setp 1
1       2       3
0       8       4
7       6       5

setp 2
1       2       3
8       0       4
7       6       5


下面是代码:
程序代码:

#include <stdio.h>
enum  direction{start,up,down,left,right};
int matrix[3][3];
int print_matrix(int);
int all_in_place();
int  iterative_deepening(int k,int d,int i,int j,enum direction dir);

int main()
{
    const int MAX_DEPTH=10;  //深度边界
    int i,j,d;
    for(i=0;i<9;i++)    //输入0~9,0表示空格
        scanf("%d",matrix[0]+i);

    for(i=0; i<9&&matrix[0][i]; i++)    //寻找空格位置
        ;
    j = i%3;
    i /= 3;
    //迭代加深的DFS盲目搜索算法,深度边界从1到MAX_DEPTH
    for(d=1;d<MAX_DEPTH && iterative_deepening(1,d,i, j,start);d++)
        ;
    return 0;
}

/*
*  k    : 当前深度
*  d    : 深度边界
*  i,j   : 空格位置
*  dir  : 上一步移动方向
*/
int  iterative_deepening(int k,int d,int i,int j,enum direction dir)
{
    int ret=1;

    if(k>d)
        return ret;

    if(all_in_place())    //    到达目标状态
        return print_matrix(k);
    else
    {
        if(dir!=up&&i<2 )    //可以向下
        {
            matrix[i][j] =     matrix[i+1][j];
            matrix[i+1][j] = 0;
            ret = iterative_deepening(k+1,d,i+1,j,down);
            matrix[i+1][j] = matrix[i][j];
            matrix[i][j] = 0;
            if(!ret)
                return print_matrix(k);
        }

        if(dir!=down&&i>0 )    //可以向上
        {
            matrix[i][j] =     matrix[i-1][j];
            matrix[i-1][j] = 0;
            ret = iterative_deepening(k+1,d,i-1,j,up);
            matrix[i-1][j] = matrix[i][j];
            matrix[i][j] = 0;
            if(!ret)
                return print_matrix(k);
        }

        if(dir!=left&&j<2 )    //可以向右
        {
            matrix[i][j] =     matrix[i][j+1];
            matrix[i][j+1] = 0;
            ret = iterative_deepening(k+1,d,i,j+1,left);
            matrix[i][j+1] = matrix[i][j];
            matrix[i][j] = 0;
            if(!ret)
                return print_matrix(k);
        }

        if(dir!=right&&j>0 )    //可以向左
        {
            matrix[i][j] =     matrix[i][j-1];
            matrix[i][j-1] = 0;
            ret = iterative_deepening(k+1,d,i,j-1,left);
            matrix[i][j-1] = matrix[i][j];
            matrix[i][j] = 0;
            if(!ret)
                return print_matrix(k);
        }
    }
    return ret;
}

int all_in_place()
{
    const int object[3][3]={{1,2,3},{8,0,4},{7,6,5}};
    int i;
    for(i=0;i<9;i++)
        if(matrix[0][i] != object[0][i])
            return 0;
    return 1;
}

int print_matrix( int count)
{
    int i,j;
    printf("\n\nsetp %d\n",count);
    for(i=0;i<3;i++,putchar('\n'))
        for(j=0;j<3;j++)
            printf("%d\t",matrix[i][j]);

    return 0;
}
搜索更多相关主题的帖子: 数码 算法 
2008-10-20 17:56
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
scanf("%d",matrix[0]+i);  //scanf("%d",&(matrix[0]+i));
收到的鲜花
  • rootkit2008-10-20 18:27 送鲜花  -2朵   附言:matrix是二维数组
  • missiyou2008-10-20 20:20 送鲜花  2朵   附言:呵呵,版主和版主玩玩吗。呵呵,不是发言了 ...

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-10-20 18:16
sf469210604
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2008-9-26
收藏
得分:0 
斑竹居然被扣分了
收到的鲜花
  • missiyou2008-10-20 20:21 送鲜花  2朵  
2008-10-20 19:48
蓝色线段树
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2008-10-18
收藏
得分:0 
正好现在我有时间,我给你调一下吧
2008-10-20 20:14
missiyou
Rank: 5Rank: 5
等 级:贵宾
威 望:16
帖 子:531
专家分:218
注 册:2007-10-9
收藏
得分:0 
如果我没猜错的话,你的错误应该是在逻辑判断上。很多你用了, && 这样就得考虑0情况。真的情况。还有一些优先级有时候我自己都搞不懂那个优先。
2008-10-20 20:31
蓝色线段树
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2008-10-18
收藏
得分:0 
我知道了,是深度不足,因为解的长度很容易超过10
但你的程序只搜索到10步,找不出也就很合理了
2008-10-20 20:56
rootkit
Rank: 1
等 级:新手上路
帖 子:197
专家分:5
注 册:2008-9-26
收藏
得分:0 
通常我对自己写的程序都比较有信心,测试又是比较无聊的事,所以把代码贴出来,让对这个游戏感兴趣的拿去玩,顺便看看有没有哪个测试用例存在MAX_DEPTH边界内的解而程序没有找出来的。

看懂了程序就知道,main函数内第一条语句就是方便你修改深度边界的,这也叫bug ?
const int MAX_DEPTH=10;  //深度边界

降妖除魔路,仗剑载酒行
借问谁家子,大唐游侠儿
2008-10-20 21:17
蓝色线段树
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2008-10-18
收藏
得分:0 
首先DFS来解这题就已经不合适啦
2008-10-20 21:41
fpxyzq
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-9-6
收藏
得分:0 
基本上A*是最好的解决办法,迭代也行啊,深度搜索也不超过几十层.
2008-10-20 21:52
fpxyzq
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-9-6
收藏
得分:0 
这些问题搞起没激情,本人就喜欢研究下棋的游戏,要是出现在棋盘中还行.
2008-10-20 22:01
快速回复:八数码问题的迭代加深算法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045462 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved