蓝桥杯集训资料题
6296: 迷宫
描述
一天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
1 #include<bits/stdc++.h> 2 using namespace std; 3 char a[105][105]; //a存储地图 4 int vis[105][105]; //vis标记数组 5 int nex[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; //nex方向数组,它代表方向的增量,右下左上 6 int n,ans,ex,ey; //n地图大小,ans是答案 7 void dfs(int x,int y) 8 { 9 if(ans==1)return; //因为找到终点了,就不用搜索了直接返回 10 if(x==ex && y==ey){ 11 ans = 1;return; //如果是终点,那么标志位ans为1,证明找到终点 12 } 13 for(int i=0;i<4;i++) //循环4个方向,注意不要等于4 14 { 15 int tx = x + nex[i][0]; 16 int ty = y + nex[i][1]; //获取下一步坐标 17 if(tx<0 || ty<0 || tx>=n || ty>=n) continue; //越界判断 18 //下一步坐标是.并且标记数组vis在这一步也没标记过,证明下一步可走 19 if(a[tx][ty]=='.' && vis[tx][ty]==0) 20 { 21 vis[tx][ty] = 1; //标记tx,ty,证明走过了 22 dfs(tx,ty); //以tx,ty作为起点,继续去搜索 23 dfs[tx,ty]; 24 } 25 } 26 } 27 int main() 28 { 29 int t;cin>>t; 30 while(t--) 31 { 32 cin>>n; 33 for(int i=0;i<n;i++) 34 for(int j=0;j<n;j++) 35 cin>>a[i][j]; 36 //以上4行是输入n*n的地图 37 memset(vis,0,sizeof(vis)); //初始化vis数组为0 38 int sx,sy; 39 cin>>sx>>sy>>ex>>ey; //输入起点 40 vis[sx][sy] = 1; //提前标志起点,不然会走回头路 41 if(a[sx][sy] == '#'){ //特殊判断起点就不能再走的情况 42 cout<<"NO"<<endl;continue; 43 } 44 ans = 0; 45 dfs(sx,sy); 46 if(ans==1)cout<<"YES"<<endl; 47 else cout<<"NO"<<endl; 48 } 49 return 0; 50 }
3286: Lake Counting
描述
由于最近的降雨,水在 Farmer John 的田地的不同地方汇集,该田地由 N x M(1 <= N <= 100;1 <= M <= 100)个正方形的矩形表示。每个方块包含水('W')或旱地('.')。农夫约翰想弄清楚他的田地里形成了多少个池塘。池塘是一组相连的正方形,其中有水,其中一个正方形被认为与其所有八个邻居相邻。
给定农夫约翰的田地图,确定他有多少个池塘。
输入
* 第 1 行:两个空格分隔的整数:N 和 M
* 第 2..N+1 行:每行 M 个字符,代表 Farmer John 的田地的一行。每个字符要么是“W”,要么是“.”。字符之间没有空格。
输出
* 第 1 行:Farmer John 田地中的池塘数量。
样例输入
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
样例输出
3
提示
输出细节:
共有三个池塘:一个在左上角,一个在左下角,一个在右侧。
1 #include<bits/stdc++.h> 2 using namespace std; 3 char a[105][105]; //1.地图 4 int vis[105][105]; //2.标记数组 5 int nex[8][2] = {{0,1},{1,0},{0,-1},{-1,0}, 6 {-1,-1},{-1,1},{1,1},{1,-1}}; //3.方向数组 7 int n,m,ans; //4.地图大小和答案变量 8 void dfs(int x,int y) 9 { 10 for(int i=0;i<8;i++) //2.遍历方向数量 11 { 12 int tx = x+nex[i][0]; 13 int ty = y+nex[i][1]; //3.下一步坐标 14 if(tx<1 || ty<1 || tx>n || ty>m)continue; //4.越界判断 15 if(a[tx][ty]=='W' && vis[tx][ty]==0) //5.判断下一步是否可行 16 { 17 vis[tx][ty] = 1; //6.可行则先标记 18 dfs(tx,ty); //7.重复调用dfs,以tx,ty作为起点搜索 19 } 20 } 21 } 22 int main() 23 { 24 cin>>n>>m; 25 for(int i=1;i<=n;i++) 26 for(int j=1;j<=m;j++) 27 cin>>a[i][j]; //1.输入地图 如果不是题目说从0开始,那么就从1到n,m 28 for(int i=1;i<=n;i++) 29 for(int j=1;j<=m;j++) 30 { 31 if(a[i][j]=='W' && vis[i][j]==0) 32 { 33 ans++; 34 dfs(i,j); 35 } 36 } 37 cout<<ans; 38 return 0; 39 }
2799:数羊
描述
不久前我睡不着觉。我常常醒着躺着,盯着天花板,一连几个小时。然后有一天,我的祖母建议我在上床睡觉后尝试数羊。一如既往,当祖母提出建议时,我决定尝试一下。唯一的问题是,我上床睡觉时周围没有羊可以数。
尽管我很有创造力,但这并不能阻止我。我坐下来写了一个计算机程序,制作了一个字符网格,其中 # 代表一只羊,而 . 是草(或者你喜欢的任何东西,只是不是羊)。为了使计数更有趣,我还决定要数羊群而不是单只羊。如果两只羊有共同的一侧(上、下、右或左),则它们属于同一群。另外,如果绵羊 A 和绵羊 B 在同一个羊群中,而绵羊 B 和绵羊 C 在同一个羊群中,那么绵羊 A 和 C 在同一个羊群中。
现在,我遇到了一个新问题。虽然数这些羊实际上可以帮助我入睡,但我发现它非常无聊。为了解决这个问题,我决定我需要另一个计算机程序来为我计数。然后我就可以在睡觉前启动这两个程序,我会安然无恙地睡到早上。我需要你为我写这个程序。
输入
输入的第一行包含一个数字 T,即后面的测试用例数。
每个测试用例都以包含两个数字 H 和 W 的一行开始,即绵羊网格的高度和宽度。然后是 H 行,每行包含 W 个字符(# 或 .),描述网格的那部分。
输出
对于每个测试用例,根据问题描述中规定的规则,输出包含单个数字的一行,表示该网格中羊群的数量。
注释和约束
0 < T <= 100
0 < H,W <= 100
样例输入
2
4 4
#.#.
.#.#
#.##
.#.#
3 5
###.#
..#..
#.###
样例输出
6
3