蓝桥杯集训资料题

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

 

posted @ 2023-03-03 21:10  CRt0729  阅读(39)  评论(0编辑  收藏  举报