openjudge 1792 迷宫 解析报告

关于一道大水题的解析报告。
1792:迷宫
总时间限制: 3000ms 内存限制: 65536kB
描述
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。
输入
第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n (1 <= n <= 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha, la, hb, lb全部是从0开始计数的。
输出
k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
样例输入
2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0
样例输出
YES
NO

看过这道题,脑子里应该突然就有想法。诶
这道题就是BFS嘛。广搜对于这种最短路径就是最好的方法。
更何况,这道题就是问你这个能不能走过,而不是问最短路径。所以就变的更简单了。
简单来说,就是套路。
队列,BFS,状态。
嗯就是这样。

hhh这道水题是我用vim第一次AC的题。
等用过Vim,就会突然觉得。这种不用鼠标的感觉,只依赖双手的打字速度的工具简直,就是完美。

 1 #include<cstdio>
 2 #include<string.h>
 3 using namespace std;
 4 char map_1[101][101];
 5 int x1,y1,x2,y2;
 6 struct node {
 7     int x,y;
 8 };
 9 int map_2[101][101];
10 int x_1[5]={0,1,-1,0,0};
11 int x_2[5]={0,0,0,1,-1};
12 node q[100001];
13 int heads,lose;
14 void push(node a)
15 {
16     q[++lose]=a;
17     return ;
18 }
19 int BFS()
20 {
21     node a;
22     a.x=x1;a.y=y1;
23     q[1]=a;
24     while(heads<=lose)//队列里有没有东西。查看状态有没有全部枚举完
25     {
26     node n;
27     n=q[heads];
28     heads++;
29     if(n.x==x2&&n.y==y2){//发现诶!可以!
30         printf("YES\n");
31         return 0;
32     }
33     for(int i=1;i<=4;i++)
34     {
35         node n1;
36         n1=n;
37         if(!map_2[n1.x+x_1[i]][n1.y+x_2[i]]&&map_1[n1.x+x_1[i]][n1.y+x_2[i]]==‘.‘)//判断继续能不能走
38         {
39             n1.x+=x_1[i];
40         n1.y+=x_2[i];
41         push(n1);
42         map_2[n1.x][n1.y]=1;
43         }
44     }
45     }
46     printf("NO\n");
47     return 0;
48 }
49 int main()
50 {
51     int n,m;
52     scanf("%d",&n);
53     while(n--)
54     {
55     memset(map_1,‘#‘,sizeof(map_1));
56     memset(map_2,0,sizeof(map_2));//初始化。这个一定不要忘了。
57     heads=lose=1;
58     scanf("%d\n",&m);
59     for(int i=1;i<=m;i++)
60     {
61         for(int j=1;j<=m;j++)
62         {
63         scanf("%c",&map_1[i][j]);
64         }
65         scanf("\n");
66     }
67     scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
68     x1+=1;y1+=1;x2+=1;y2+=1;//这道题这个地方特别坑,认真读题
69     if(map_1[x1][y1]==‘#‘||map_1[x2][y2]==‘#‘)
70     {
71         printf("NO\n");
72         continue;
73     }
74     BFS();
75     }
76     return 0;
77 }

嗯就是这样。

时间: 2024-11-10 13:03:54

openjudge 1792 迷宫 解析报告的相关文章

NOI openjudge 1792.迷宫

一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到.如果起点或者终点有一个不能通行(为#),则看成无法办到. 输入 第1行是测试数据的组数k,后面跟着k组输入.每组测试数据的第1行是一个正整数n (1 <= n <= 10

洛谷OJ P1141 01迷宫 解题报告

洛谷OJ P1141 01迷宫 解题报告 by MedalPluS [题目描述]    有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上.你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身).   [输入描述]   输入的第1行为两个正整数n,m.  下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格.  接下来m行,每行2个用空格分隔的正整数i,j,对

OpenJudge 2985数字组合 解析报告/DP

2985:数字组合 总时间限制:  1000ms 内存限制:  65536kB 描述 有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式.如:n=5,5个数分别为1,2,3,4,5,t=5:那么可能的组合有5=1+4和5=2+3和5=5三种组合方式. 输入 输入的第一行是两个正整数n和t,用空格隔开,其中1<=n<=20,表示正整数的个数,t为要求的和(1<=t<=1000)接下来的一行是n个正整数,用空格隔开. 输出 和为t的不同的组合方式的数目. 样例输入 5 5 1

oj 1792:迷宫 广搜和深搜

描述 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到.如果起点或者终点有一个不能通行(为#),则看成无法办到.输入第1行是测试数据的组数k,后面跟着k组输入.每组测试数据的第1行是一个正整数n (1 <= n <= 1

BZOJ1088扫雷Mine 解析报告

1088: [SCOI2005]扫雷Mine Description 相信大家都玩过扫雷的游戏.那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来.万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目.现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案. Input 第一行为

codevs4247奇特的生物 解析报告

4247 奇特的生物 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 科学家们最近发现了一种奇怪的生物,它们每天长大一岁,刚出生的宝宝为1岁,且它们的年龄没有上限.已知年龄为1岁,2岁,3岁,……,k岁的个体具有生育能力,当年龄为i的具有生育能力的个体将长大一岁时会生下ai个1岁的幼崽.假设第一天只有一个年龄为1的幼崽,现在科学家们想知道第x天年龄为y的个体有多少,但由于该物种增长速度太快,于是他们将这个任务交给了你

NOI 题库 1792

1792  迷宫 描述 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行.同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到.如果起点或者终点有一个不能通行(为#),则看成无法办到. 输入 第1行是测试数据的组数k,后面跟着k组输入.每组测试数据的第1行是一个正整数n (1

hdu1520 Anniversary party(poj2342,树形dp)

Anniversary party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7303 Accepted Submission(s): 3220 Problem Description There is going to be a party to celebrate the 80-th Anniversary of the Ural

Jmeter+maven+Jenkins构建云性能测试平台(mark 推荐)

转自:http://www.cnblogs.com/victorcai0922/archive/2012/06/20/2555502.html Jmeter+maven+Jenkins构建云性能测试平台(一) 最近在利用Jmeter来做一套自动化性能测试框架,做自动化性能测试框架的目的 是希望能够针对系统做一个benchmark的性能测试,能够快速的在每个版本发布后,对该版本进行benchmark性能测试,以比较与上一个版本的性 能是否发生变化,若发生变化便可以快速的通知开发人员以确定性能发生变