迷 宫

Description

Karles 和朋友到迷宫玩耍,没想到遇上了 10000000 年一次的大洪水,好在 Karles 是一个喜

欢思考的人,他发现迷宫的地形和洪水有如下性质:

①迷宫可以被看做是一个 N*M 的矩形方阵,其中左上角坐标为(1,1),右下角坐标为(n,m),

每个格子(i,j)都有一个高度 h(i,j)。

②洪水从(sx,sy)开始,如果一个格子被洪水淹没,那这个格子四周比它低(或相同)的格子

也会被淹没。

现在 Karles 想请你帮忙算算,有多少个格子不会被淹没,以及 Karles 想问一下格子(x,y)是否

被淹没,如果被淹没的话就输出”Yes”,否则输出”No”。

Input

第一行包含两个整数 n,m。

以下 n 行,每行 m 个数,第 i 行第 j 个数表示格子高度 h(i,j)。

下面一行包含两个整数 sx,sy,表示最初被洪水淹没的格子。

下面一行包含一个整数 q,表示询问的数量。

最后 q 行每行包含两个整数 x,y,表示询问的格子。

Output

输出的第一行,为永远不会被淹没的格子的数量。

以下 q 行,为格子被淹没的情况,输出”Yes”或者”No”(不包含引号)

Example

maze.in maze.out

3 3

1 2 3

2 3 4

3 4 5

2 2

2

1 2

2 3

5

Yes

No

Hint

对于 10%的数据,(sx,sy)为迷宫内的最高点。

对于 30%的数据,1<=N,M<=5,q=1。

对于 60%的数据,1<=N,M<=100,q<=100。

对于 100%的数据,1<=N,M<=2000,q<=1000。

思路:很简单的棋盘型dfs问题,只要控制好边界,方向,高度,一步一步的搜索就可以、

         最后的询问需要单独开一个vis数组

         范围!范围!范围!

没看范围全部爆内存的代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<cstdlib>
 7 using namespace std;
 8 int xx[5]={-1,+1,0,0};
 9 int yy[5]={0,0,-1,+1};
10 int a[10001][10001];
11 int vis[10001][10001];
12 int tot;
13 int n,m;
14 void dfs(int x,int y)
15 {
16     vis[x][y]=1;
17     for(int i=0;i<4;i++)
18     {
19         int h=a[x][y];
20         if(a[x+xx[i]][y+yy[i]]<=h&&vis[x+xx[i]][y+yy[i]]==0&&x+xx[i]>=1&&x+xx[i]<=n&&y+yy[i]>=1&&y+yy[i]<=m)
21         {
22             tot--;
23             vis[x+xx[i]][y+yy[i]]=1;
24             dfs(x+xx[i],y+yy[i]);
25         }
26     }
27 }
28 int main()
29 {
30     freopen("maze.in","r",stdin);
31     freopen("maze.out","w",stdout);
32     scanf("%d%d",&n,&m);
33     tot=n*m;
34     for(int i=1;i<=n;i++)
35     {
36         for(int j=1;j<=m;j++)
37         {
38             scanf("%d",&a[i][j]);
39         }
40     }
41     int sx,sy;
42     scanf("%d%d",&sx,&sy);
43     dfs(sx,sy);
44     int q;
45     scanf("%d",&q);
46     printf("%d\n",tot-1);
47     for(int i=1;i<=q;i++)
48     {
49         int qx,qy;
50         scanf("%d%d",&qx,&qy);
51         if(vis[qx][qy]==1)
52         {
53             printf("Yes\n");
54         }
55         else
56         {
57             printf("No\n");
58         }
59     }
60     fclose(stdin);
61     fclose(stdout);
62     return 0;
63 }

 

posted @ 2017-04-07 21:31  自为风月马前卒  阅读(270)  评论(0编辑  收藏  举报

Contact with me