GRYZ 模 拟 赛 系 列 之 迷 宫(不就是个洪水)
-
迷 宫
(maze.cpp/c/pas)
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。
这个题,很水,但是,文件名多敲了一个空格所以0分;23333
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> using namespace std; int n,m; int hill[2010][2010]; bool mdzz[2010][2010]; int tot=0; void dfs(int x,int y) { tot++; mdzz[x][y]=1; if(x+1<=n&&hill[x+1][y]<=hill[x][y]&&mdzz[x+1][y]==0) dfs(x+1,y); if(x-1>=1&&hill[x-1][y]<=hill[x][y]&&mdzz[x-1][y]==0) dfs(x-1,y); if(y+1<=m&&hill[x][y+1]<=hill[x][y]&&mdzz[x][y+1]==0) dfs(x,y+1); if(y-1>=1&&hill[x][y-1]<=hill[x][y]&&mdzz[x][y-1]==0) dfs(x,y-1); else return; } int main() { freopen("maze.in","r",stdin); freopen("maze.out","w",stdout); int sx,sy; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&hill[i][j]); mdzz[i][j]=0; } scanf("%d%d",&sx,&sy); dfs(sx,sy); printf("%d\n",m*n-tot); int saber; int qwq,qaq; scanf("%d",&saber); for(int i=1;i<=saber;i++){ scanf("%d%d",&qwq,&qaq); if(mdzz[qwq][qaq]==0)printf("No\n"); else printf("Yes\n"); } fclose(stdin); fclose(stdout); return 0; }