| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 366 人关注过本帖
标题:请问这种叫什么算法?
只看楼主 加入收藏
asianh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-5-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
请问这种叫什么算法?
图片附件: 游客没有浏览图片的权限,请 登录注册


描述:有一个 W * H (上图是 5 * 3)的表格,从任意一个格子出发,每次走一相邻的格子,不重复遍历所有的格子。如果不能遍历所有,则要求算出最长的一条路径。

本来想找找别人的贴。但好多是说骑士遍历,跟这个不同。
又不知道这种叫什么算法,要怎么求。请帮忙写一写算法过程。

[ 本帖最后由 asianh 于 2011-5-8 06:27 编辑 ]
搜索更多相关主题的帖子: 骑士 
2011-05-08 06:24
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
简单的遍历 可以用栈操作
2011-05-08 08:54
asianh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-5-8
收藏
得分:0 
回复 2楼 寒风中的细雨
不说技巧,只说逻辑思路,怎么做?
2011-05-08 10:47
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
用栈实现不就是技巧吗

你也可以用递归  


2011-05-08 12:07
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
程序代码:
#include <stdio.h>
#include <time.h>

#define WIDTH    5
#define HEIGHT    3

struct point
{
    int x;
    int y;
};

struct point moving[4] =
{
    {1, 0},  //沿着x轴正向移动
    {0, 1},  //沿着y轴正向移动
    {-1, 0}, //沿着x轴反向移动
    {0, -1}, //沿着y轴反向移动
};

int map[HEIGHT][WIDTH] = {0};

int get_xy(int M)
{
    srand(time(NULL));

    return rand()%M;
}
/*

 *参数p表示将要标记的点 即在程序的执行当中标记1 表示已经

 *遍历过    *counter表示计数器 计数器满后则程序退出。

 */
int deal(struct point p, int *counter)
{
    struct point temp;
    int i = 0;
   
    //标记
    map[p.y][p.x] = 1;
    if (++*counter == WIDTH*HEIGHT)
    {
        return 1;
    }

    for ( ; i<4; ++i )
    {
        temp.x = p.x + moving[i].x;
        temp.y = p.y + moving[i].y;
       
        if (temp.x>=0 && temp.x<WIDTH &&
            temp.y<HEIGHT && temp.y>=0 &&
            !map[temp.y][temp.x])
        {
            if (deal(temp, counter))
            {
                printf("(%d, %d) ", temp.x, temp.y);

                return 1;
            }
        }
    }
    if ( i==4 )
    {
        --*counter;
    }

    return 0;
}

int main(void)
{
    int counter = 0;
    struct point p;
    p.x = get_xy(WIDTH);
    p.y = get_xy(HEIGHT);

    deal(p, &counter);
    if ( counter == 15 )
    {
        printf("(%d, %d)\n", p.x, p.y);
    }

    return 0;
}

图片附件: 游客没有浏览图片的权限,请 登录注册


还有点问题  有时候没有数据输出


基本原理是 选取一个点  向四个方向搜索 如果有满足条件的点  则以满足条件的点 继续向四个方向搜索  一直继续下去 直到 全部遍历完。。。
当然四个方向的权值可以自己定。。。 顺那个方位就定那个开始或结束吧  
2011-05-08 13:41
asianh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2011-5-8
收藏
得分:0 
回复 5楼 寒风中的细雨
谢谢解答。我总感觉,无论按哪个方向,都不能很智能。唉,算了,递归就递归吧。
2011-05-08 17:07
快速回复:请问这种叫什么算法?
数据加载中...
 
   



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

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