| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3129 人关注过本帖, 1 人收藏
标题:递归的迷宫问题,请问代码错在什么地方
取消只看楼主 加入收藏
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
结帖率:96.88%
收藏
已结贴  问题点数:20 回复次数:4 
递归的迷宫问题,请问代码错在什么地方
A maze is to be represented by a 12*12 array composed of three values: Open, Wall, or Exit. There is one exit from the maze. Write a program to determine whether it is possible to exit the maze from the starting point (any open square can be a starting point). You may move vertically and horizontally to any adjacent open square(左右上下四个方向). You may not move to a square containing a wall. The input consists of a series of 12 lines of 12 characters each, representing the contents of each square in the maze. The characters are O, W, or E.
【输入】 12×12的迷宫方阵,每个格子的可能取值有:O, W, or E,输入数据能够确保迷宫只有一个出口。
任意3个起点的坐标,格式如下(x,y)。其中x为纵坐标,y为横坐标,起始坐标从左上角的格子开始,坐标起始值为0.
【输出】
起点到出口的最短路径长度(经过多少个方格),若起点无法到达出口则输出-1。起始节点和结束节点都算入路径长度的计算。

例如:
【输入】
O W O W O W O O W O W O
O W O W W W W O W O O E
O W W W O O O O O O O O
W W W O O O O W W W O W
O O O O W W W O O O O O
O O W O W O W O W O W W
O W W O O O W W O O O W
O O W O O W W W O O O O
O O O W O O O O W W W W
W W W O O O O W W W O O
O W W W W O O O O O W W
W W W O O O O O W W W W
(0,0) (5,7) (7,8)
【输出】
-1 9 10
【解释】
输出表示第一个点(0,0)无法到达出口;
第二个点(5,7)到达出口的最短路径是9;
第三个点(7,8)到达出口的最短路径是10;
搜索更多相关主题的帖子: 输出 the 迷宫 代码 坐标 
2020-04-19 21:08
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
#include<stdio.h>
#include<iostream>
using namespace std;
class migong
{  public:
    migong();
    void initial();
    int jisuan();
    void seten();
    void solved(int x,int y,int n);
private:
    int Migong[12][12];
    int step;
    int Ex;
    int Ey;
};
migong::migong()
{
    step=1000000;
}
void migong::initial()
{
    step=1000000;
}
void migong::seten()
{
    for(int i = 0; i<12; i++)
 {
  for(int j = 0; j < 12; j++)
  {
   char temp;
   cin>>temp;
   if(temp=='W')
            Migong[i][j]=1;
            else if(temp=='E')
            {
                Ex=i;
                Ey=j;
                Migong[i][j]=0;
            }
   else if(temp=='O')
    Migong[i][j]=0;
    }
  }


}

void migong::solved(int x,int y,int n)
{
 if(Migong[x][y]!=0)
  return;
 if(x==Ex&&y==Ey)
 {

  step=min(step,n);
  return;
 }
if(x > 0)
solved(x-1,y,n+1);
 if(y > 0)
 solved(x,y-1,n+1);
 if(x < 11)
solved(x+1,y,n+1);
 if(y < 11)
 solved(x,y+1,n+1);
 Migong[x][y]=0;
 return;
}
int migong::jisuan()
{
    return step;
}
int main()
{
    migong A;
    A.seten();
    for(int i=0;i<3;i++)
    {     A.initial();
        int x,y;
        char c;
        cin>>c>>x>>c>>y>>c;
        A.solved(x,y,0);
        if(A.jisuan()==1000000)
            cout << "-1";
   else
    cout << A.jisuan()+1 <<' ';
     }
}

//最近刚学了八皇后问题,知道什么叫回溯...看不出来问题在哪里QAQ

我想要两颗西柚。
2020-04-19 21:11
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
//orz虽然不知道什么叫重复性剪枝,但我发现我少写了一行,改了一下能出结果
//我开头写的是什么我也不知道QAQ
#include<stdio.h>
#include<iostream>
using namespace std;
class migong
{  public:
    migong();
    void initial();
    int jisuan();
    void seten();
    void solved(int x,int y,int n);
private:
    int Migong[12][12];
    int step;
    int Ex;
    int Ey;
};
migong::migong()
{
    step=1000000;
}
void migong::initial()
{
    step=1000000;
}
void migong::seten()
{
    for(int i = 0; i<12; i++)
 {
  for(int j = 0; j < 12; j++)
  {
   char temp;
   cin>>temp;
   if(temp=='W')
            Migong[i][j]=1;
            else if(temp=='E')
            {
                Ex=i;
                Ey=j;
                Migong[i][j]=0;
            }
   else if(temp=='O')
    Migong[i][j]=0;
    }
  }


}

void migong::solved(int x,int y,int n)
{
 if(Migong[x][y]!=0)
  return;
 if(x==Ex&&y==Ey)
 {

  step=min(step,n);
  return;
 }
 Migong[x][y]=1;
if(x > 0)
solved(x-1,y,n+1);
 if(y > 0)
 solved(x,y-1,n+1);
 if(x < 11)
solved(x+1,y,n+1);
 if(y < 11)
 solved(x,y+1,n+1);
 Migong[x][y]=0;

}
int migong::jisuan()
{
    return step;
}
int main()
{
    migong A;
    A.seten();
    for(int i=0;i<3;i++)
    {     A.initial();
        int x,y;
        char c;
        cin>>c>>x>>c>>y>>c;
        A.solved(x,y,0);
        if(A.jisuan()==1000000)
            cout << "-1"<<' ';
   else
    cout << A.jisuan()+1 <<' ';
     }
}

我想要两颗西柚。
2020-04-20 15:11
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
回复 9楼 return_0
emmm因为我水平太烂了加上自学能力极弱看得一知半解,现在我数据结构课刚学到递归,dfs我还没接触过,不过这学期应该会讲到这类题,等讲到dfs我应该就能明白了,谢谢大神!

我想要两颗西柚。
2020-04-21 11:28
komorebi0110
Rank: 2
来 自:上海
等 级:论坛游民
帖 子:145
专家分:17
注 册:2019-11-23
收藏
得分:0 
回复 11楼 wmf2014
谢谢!

我想要两颗西柚。
2020-04-25 17:23
快速回复:递归的迷宫问题,请问代码错在什么地方
数据加载中...
 
   



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

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