BJFU-ACM-1473【红】sunshine16被困了

来源:互联网 发布:倚天现货交易软件 编辑:程序博客网 时间:2024/04/27 18:53

描述

故事发生在很久很久以前,在山的那边有一群黄精灵,他们很喜欢捉弄人。有一天,sunshine16迷路走到了黄精灵布置的迷宫中,0代表路,1代表墙,sunshine16被困在迷宫中,只可以上下左右走,不可以斜着走。

这个迷宫错综复杂,sunshine16有封闭恐惧症,所以他迫切的想要找到出口,如果不能很快的找到出口的话,他会很害怕, 同学们快来帮帮他吧。

sunshine16的初始位置在第一行第一列,他现在要尽快的跑到出口(最后一行最后一列)


输入

输入包含多组数据

先输入一个正整数n,接下来是一个n*n的矩阵。(保证存在至少一条逃跑路线)(1<=n<=20)

输出

输出其中最短路径的长度。

样例输入

40 1 1 10 1 0 00 1 0 10 0 0 030 0 00 1 00 1 0

样例输出

75
------------------------------------------------------------------------------------
很明显,这是一道很典型的搜索问题。对于找寻路径的问题大概都可以使用搜索进行解答。并利用STL中提供的栈与队列进行数据存储。我解这道题使用的是广搜的思想。先将起点放入,搜索四周可以到达的点,存入队列中,之后搜索过的点抛出队列。循环往复,直至到达终点为止,如果队列为空仍未找到则不存在通路。
以下,是我的代码。
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stdio.h"  
#include "string.h" 
#include <queue>  
using namespace std;  
int a[625],b[625],t;  
int bfs(int n)  
{  
    int pos,step=1; 
    queue <int> s; 
    b[0]=1; 
    s.push(0); 
    s.push(step); 
    for(;;) 
    
    pos=s.front();s.pop(); 
    step=s.front();s.pop(); 
    //printf("%d %d\n",pos,step); 
    if (a[pos+n]==0&&pos+n<n*n&&b[pos+n]==0) {s.push(pos+n);s.push(step+1);b[pos+n]=1;} 
    if (a[pos-n]==0&&pos-n>=0&&b[pos-n]==0) {s.push(pos-n);s.push(step+1);b[pos-n]=1;} 
    if (a[pos+1]==0&&pos%n+1<n&&b[pos+1]==0) {s.push(pos+1);s.push(step+1);b[pos+1]=1;} 
    if (a[pos-1]==0&&pos%n-1>=0&&b[pos-1]==0) {s.push(pos-1);s.push(step+1);b[pos-1]=1;} 
    if (pos==n*n-1) {break;} 
    
    return step; 
        
}  
int main()  
{  
    int i,j,p;  
    while(scanf("%d",&t)!=EOF)  
    {  
    for(i=0;i<t*t;i++)  
    {  
    scanf("%d",&a[i]);                    
    }  
    p=bfs(t);  
    printf("%d\n",p);  
    memset(a,0,sizeof(a)); 
    memset(b,0,sizeof(b)); 
    }  
    return 0;  
}
0 0
原创粉丝点击