6264:走出迷宫(DFS)

描述

当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。

输入
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符‘.‘表示空地,‘#‘表示墙,‘S‘表示起点,‘T‘表示出口。
输出
输出从起点到出口最少需要走的步数。
DFS

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <algorithm>

using namespace std;

int n,m,walk[200][200],sx,sy,ex,ey,ans=0x3f3f3f3f;
char s[200][200];

int row[4]={-1,0,1,0};
int col[4]={0,1,0,-1};

void DFS(int x,int y,int sum)
{
    if(x==ex&&y==ey)
    {
        if(sum<ans)
            ans=sum;
        return;
    }
    for(int i=0;i<=3;i++)
    {
        int xx=x+row[i];
        int yy=y+col[i];
        if(xx>=0&&xx<m&&yy>=0&&yy<n&&walk[xx][yy]>sum+1&&s[xx][yy]!=‘#‘)
        {
            walk[xx][yy]=sum+1;
            DFS(xx,yy,sum+1);
        }

    }
    return;
}
int main()
{
    cin>>m>>n;
    memset(walk,0x3f,sizeof(walk));
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>s[i][j];
            if(s[i][j]==‘S‘)
            {
                sx=i;sy=j;
            }
            if(s[i][j]==‘T‘)
            {
                ex=i;ey=j;
            }
        }
    }
    walk[sx][sy]==0;
    DFS(sx,sy,0);
    cout<<ans<<endl;
    return 0;
}

BFS

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>

using namespace std;

const int maxn=100;
struct node{
    int x,y;
    int step;
}S,T,Node;

int n,m;
char maze[maxn][maxn];
bool inq[maxn][maxn];
int X[4]={0,0,1,-1};
int Y[4]={1,-1,0,0};

bool test(int x,int y)
{
    if(x>=n||x<0||y>=m||y<0)    return false;
    if(maze[x][y]==‘#‘||inq[x][y]==true)    return false;

    return true;
}

int BFS()
{
    queue<node>q;
    q.push(S);
    while(!q.empty())
    {
        node top=q.front();
        q.pop();
        if(top.x==T.x&&top.y==T.y)
        {
            return top.step;
        }
        for(int i=0;i<4;i++)
        {
            int newX=top.x+X[i];
            int newY=top.y+Y[i];
            if(test(newX,newY))
            {
                Node.x=newX;Node.y=newY;
                Node.step=top.step+1;
                q.push(Node);
                inq[newX][newY]=true;
            }
        }
    }
    return -1;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {

        for(int j=0;j<m;j++)
        {
            cin>>maze[i][j];
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(maze[i][j]==‘S‘)
            {
                S.x=i;
                S.y=j;
            }
            if(maze[i][j]==‘T‘)
            {
                T.x=i;
                T.y=j;
            }
        }
    }

    S.step=0;
    printf("%d\n",BFS());
    return 0;
}

原文地址:https://www.cnblogs.com/Fy1999/p/9011519.html

时间: 2024-07-30 11:37:06

6264:走出迷宫(DFS)的相关文章

6264:走出迷宫

题目链接:http://noi.openjudge.cn/ch0205/6264/ 总时间限制: 1000ms 内存限制: 65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. 输入 第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数.接下来n行,每行一个长为m的字符串,表示整个迷宫的布局.字符'.'表示空地,'#'表示墙,'

Openjudge 2.5 6264:走出迷宫

总时间限制:  1000ms 内存限制:  65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. 输入 第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数.接下来n行,每行一个长为m的字符串,表示整个迷宫的布局.字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口. 输出 输出从起点到出口最少需要走的步数. 样例输

&lt;20&gt;【掌握】《走出迷宫》游戏代码实现+【理解】《走出迷宫》游戏优化

#include <stdio.h> #define COL 6 #define ROW 6 int main(int argc, const char * argv[]) { //****** 定义变量 ********** //1.定义变量,地图.存储用户输入的方向.小人的位置     char map[ROW][COL]={         {'#','#','#','#','#','#'},         {'#','O','#','#',' ',' '},         {'#'

走出迷宫, 你适合什么职业?

[走出迷宫, 你适合什么职业? ] 终点A的人适合职业: police.教练.作家. 终点B的人适合职业: 漫画家.会计.导演.设计师. 终点C的人适合职业: 领导.律师.指挥. 终点D的人适合职业: 医生.教师.歌手.记者.工人. 终点E的人适合职业: 演员.司机.商人.基层管理人员. 我走出来是 C...可是我是老师... 走出迷宫, 你适合什么职业?

1254:走出迷宫

题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1254 1254:走出迷宫 时间限制: 1000 ms         内存限制: 65536 KB提交数: 2502     通过数: 1154 [题目描述] 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. [输入] 第一行是两个整数n和m(1≤n,m≤10

C语言(简单游戏)-走出迷宫

1 #include <stdio.h> 2 //宏定义 maze[ROWS][COLS];行和列; 3 #define ROWS 7 4 #define COLS 6 5 //绘制迷宫(全局变量) 6 char maze[ROWS][COLS]= { 7 {'#','#','#','#','#','#'}, 8 {'#','0','#',' ',' ',' '}, 9 {'#',' ','#',' ','#','#'}, 10 {'#',' ','#',' ',' ','#'}, 11 {'

宽搜-走出迷宫

描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. 输入第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数.接下来n行,每行一个长为m的字符串,表示整个迷宫的布局.字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口.输出输出从起点到出口最少需要走的步数.样例输入 3 3 S#T .#. ... 样例输出 6 普通的搜索,但数据

2-5-6264:走出迷宫

描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路. 输入第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数.接下来n行,每行一个长为m的字符串,表示整个迷宫的布局.字符'.'表示空地,'#'表示墙,'S'表示起点,'T'表示出口.输出输出从起点到出口最少需要走的步数.样例输入 3 3 S#T .#. ... 样例输出 6 1 #includ

走出迷宫小游戏

#include <stdio.h>/* 游戏说明:玩家通过键盘录入 w,s,a,d控制小人向不同方向移动,其中w代表向上移动,s代表向下移动,a代表向左移动,d 代表向右移动,当小人移动到出口位置,玩家胜利  地图如下: ###### #O# # ## # #  # # ##   # ###### 说明: # 代表 墙 O代表小人 ' ' 代表路 分析:    1.打印地图       1.保存地图       2.打印    2.让玩家移动小人       1.提示玩家如何移动小人