| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10869 人关注过本帖
标题:迷宫问题
只看楼主 加入收藏
吴珂
Rank: 1
等 级:新手上路
帖 子:16
专家分:2
注 册:2010-3-31
结帖率:50%
收藏
 问题点数:0 回复次数:10 
迷宫问题
标题: 迷宫问题
时 限: 100000 ms
内存限制: 100000 K
总时限: 300000 ms
描述: 迷宫问题
 
迷宫是一个二维矩阵,其中1为墙,0为路,3为入口,4为出口.要求从入口开始,从出口结束,按照 下,左,上,右 的顺序来搜索路径.
输入: 迷宫宽度w 迷宫高度h
迷宫第一行
迷宫第二行
...
迷宫第h 行
输出: 入口横坐标1  入口纵坐标1
横坐标2       纵坐标2
横坐标3       纵坐标3
横坐标4       纵坐标4
...
横坐标n-1    纵坐标n-1
出口横坐标n 出口纵坐标n
输入样例: 8 10
1 1 1 1 1 1 1 1
1 0 1 1 0 1 0 1
1 0 1 0 0 1 0 1
1 1 0 3 1 0 1 1
1 0 0 1 0 0 4 1
1 0 0 0 0 1 1 1
1 0 1 0 0 1 0 1
1 0 1 0 0 0 1 1
1 1 1 1 0 0 0 1
1 1 1 1 1 1 1 1
输出样例: 3 3
2 3
2 4
2 5
3 5
3 6
3 7
4 7
4 6
4 5
4 4
5 4
6 4
  
提示: 使用栈

 
搜索更多相关主题的帖子: 迷宫 
2010-05-26 19:55
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

int visit(int, int);

int maze[7][7] = {{2, 2, 2, 2, 2, 2, 2},
                  {2, 0, 0, 0, 0, 0, 2},
                  {2, 0, 2, 0, 2, 0, 2},
                  {2, 0, 0, 2, 0, 2, 2},
                  {2, 2, 0, 2, 0, 2, 2},
                  {2, 0, 0, 0, 0, 0, 2},
                  {2, 2, 2, 2, 2, 2, 2}};

int startI = 1, startJ = 1;  // 入口
int endI = 5, endJ = 5;  // 出口
int success = 0;

int main(void) {
    int i, j;

    printf("显示迷宫:\n");
    for(i = 0; i < 7; i++) {
        for(j = 0; j < 7; j++)
            if(maze[i][j] == 2)
                printf("█");
            else
                printf("  ");
        printf("\n");
    }

    if(visit(startI, startJ) == 0)
        printf("\n没有找到出口!\n");
    else {
        printf("\n显示路径:\n");
        for(i = 0; i < 7; i++) {
            for(j = 0; j < 7; j++) {
                if(maze[i][j] == 2)
                    printf("█");
                else if(maze[i][j] == 1)
                    printf("◇");
                else
                    printf("  ");
            }
            printf("\n");
        }
    }

    return 0;
}

int visit(int i, int j) {
    maze[i][j] = 1;

    if(i == endI && j == endJ)
        success = 1;

    if(success != 1 && maze[i][j+1] == 0) visit(i, j+1);
    if(success != 1 && maze[i+1][j] == 0) visit(i+1, j);
    if(success != 1 && maze[i][j-1] == 0) visit(i, j-1);
    if(success != 1 && maze[i-1][j] == 0) visit(i-1, j);

    if(success != 1)
        maze[i][j] = 0;
   
    return success;
}  
自己改下吧 思路应该差不多的


2010-05-26 21:56
chenaiyuxue
Rank: 5Rank: 5
来 自:山东滨州
等 级:职业侠客
帖 子:334
专家分:370
注 册:2008-5-20
收藏
得分:0 
可以搜一下回溯算法

你是雪,我是尘埃,相遇是意外;你坠落,在我胸怀,流进我血脉。
2010-05-27 09:45
吴珂
Rank: 1
等 级:新手上路
帖 子:16
专家分:2
注 册:2010-3-31
收藏
得分:0 
谢谢啦哥们
2010-05-27 19:33
lii_yong
Rank: 2
等 级:论坛游民
帖 子:34
专家分:21
注 册:2010-5-14
收藏
得分:0 
呵呵
2010-05-28 09:47
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
难得在编程论坛看到一个优秀的代码, 学习一下,

作者:鬼鬼千年
#include<stdio.h>
int maze[10][10] = {
        {1,1,1,1,1,1,1,1,1,1},
        {1,0,0,1,0,0,0,1,0,1},
        {1,0,0,1,0,0,0,1,0,1},
        {1,0,0,0,0,1,1,0,0,1},
        {1,0,1,1,1,0,0,0,0,1},
        {1,0,0,0,1,0,0,0,0,1},
        {1,0,1,0,0,0,1,0,0,1},
        {1,0,1,1,1,0,1,1,0,1},
        {1,1,1,0,0,0,0,0,0,1},
        {1,1,1,1,1,1,1,1,1,1}};/*初始化迷宫*/
int mark[10][10] = {0};/*初始化标志位,0代表没走过,1代表走过*/

/*方向*/
typedef struct{
    short int vert;
    short int horiz;
}offsets;

offsets move[4] = {{0,1},{1,0},{0,-1},{-1,0}};/*北,东,南,西*/


/*迷宫类型*/
typedef struct element{
    short int row;
    short int col;
    short int dir;
}element;

element stack[100];


void path(void);
  element del(int* top);
void add(int* top,element item);


element del(int* top)/*出栈,top指向栈顶元素*/
{
    if(*top == -1)
    {
        printf("stack is empty!\n");
    }
    return stack[(*top)--];
}



void add(int* top,element item)/*入栈*/
{
    if(*top >= 100)
    {
        printf("stack is full!\n");
        return;
    }
    stack[++*top] = item;
}


void path(void)/*迷宫函数*/
{
    element position;
    int i,row,col,next_row,next_col,dir,top;
    int found = 0;
    mark[1][8] = 1,top = 0;/*初始化标志数组元素以及栈*/
    stack[0].row = 1,stack[0].col = 8,stack[0].dir = 0;
    while(top > -1 && !found)
    {
          position= del(&top);  /*将栈顶元素取出,*/
        row = position.row;            /*利用中间变量row,col,dir等候判断*/
        col = position.col;
        dir = position.dir;
        while(dir < 4 && !found)
        {
            next_row = row + move[dir].vert;
            next_col = col + move[dir].horiz;
            if(row == 7 && col == 1)
                found = 1;
            else if(!maze[next_row][next_col] && !mark[next_row][next_col])/*判断下一步可走并且没走过,则入栈*/
                    {
                        mark[next_row][next_col] = 1;
                        position.row = row;
                        position.col = col;
                        position.dir = ++dir;
                        add(&top,position);/*合理则入栈*/
                        row = next_row;/*继续向下走*/
                        col = next_col;dir = 0;
                    }
                    else
                        dir++;/*dir<4时,改变方向*/
      
        }
        if(found)/*判断是否有出口*/
        {
            printf("the path is:\n");
            printf("row col\n");
            for(i = 0;i <= top;++i)
                printf("(%2d,%5d)",stack[i].row,stack[i].col);
                printf("(%2d,%5d)\n",7,1);
            
            
        }
         
            
    }
    if(found==0)
        printf("没有路径\n");
}


int main(void)
{   
    path();
     
return 0;
}

我就是真命天子,顺我者生,逆我者死!
2010-05-28 12:45
l3315534
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2009-12-28
收藏
得分:0 
  这个程序不错,改改的话我可以拿去做课程设计了 哈哈谢谢啦
2010-06-22 19:06
会飞的蛋
Rank: 1
等 级:新手上路
帖 子:16
专家分:5
注 册:2013-6-10
收藏
得分:0 
回复 2楼 草狼
这个能不能加个三元组输出
2013-06-10 12:41
hemoely
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-3-24
收藏
得分:0 
小白来瞧瞧
2014-03-20 16:49
阿木木
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-5-25
收藏
得分:0 
大神能不能帮忙解释一下迷宫算法中的Pass,Footprint,Markprint算法?
2014-05-25 22:42
快速回复:迷宫问题
数据加载中...
 
   



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

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