SP12880 题解

这是一道很水的题目,但是本蒟蒻还是调了很久……

首先解释一下各个图形的意义:

. 表示空地,狼和羊都可以在上面行走。

# 表示栅栏,不可以经过。

v 表示狼。

k 表示羊。

题目中的样例没有换行我来改一下:

8 8 
.######.  
#..k...#  
#.####.#  
#.#v.#.#  
#.#.k#k#  
#k.##..#  
#.v..v.#  
.######.
3 1

思路

一道bfs的模板题,我们可以从头到尾将地图扫一遍,如果当前位置上是狼或羊并且还没被访问过,就以这个点为起点去进行 bfs,如果当前区域内的狼数量大于羊则羊全部死亡,否则狼全部死亡,特别要注意的是如果狼和羊数量相同则狼和羊均不死亡,还有如果能够离开整个地图狼与羊也不会死亡。

所以这题其实就是一个 bfs 模板加一些特判。

代码

#include<bits/stdc++.h>
using namespace std;
char mp[300][300];//地图 
bool vis[300][300];//记录每个位置是否被访问过 
int s,w,dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}},n,m;//dir数组是方向数组 
struct node{
    int x,y;
};
bool check(int x,int y){
    return x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y]&&mp[x][y]!='#';
}
void bfs(int x,int y){
    queue<node> q;
    q.push({x,y});
    vis[x][y]=1;
    int a=0,b=0;//a记录羊,b记录狼 
    bool flag=1;
    while(!q.empty()){
        node t=q.front();
        q.pop();
        if(mp[t.x][t.y]=='k'){
            a++;//判断羊的情况 
        }
        if(mp[t.x][t.y]=='v'){
            b++;//判断狼的情况 
        }
        if(t.x==n||t.y==m||t.x==1||t.y==1){
            flag=0;//标记一下如果能走出地图的情况 
        }
        //模板 
        for(int i=0;i<4;i++){
            int dx=t.x+dir[i][0];
            int dy=t.y+dir[i][1];
            if(check(dx,dy)){
                q.push({dx,dy});
                vis[dx][dy]=1;
            }
        }
    }
    //如果能走出地图,狼和羊都不会死亡 
    if(!flag){
        w+=b,s+=a;
        return ;
    }
    if(a>b){
        w+=b;
    }
    if(b>a){
        s+=a;
    }
    //一定要特判! 
    if(b==a){
        w+=b,s+=a;
    }
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>mp[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            //这里的()一定不能忘,因为&&的优先级>||,本蒟蒻因为这个问题调了好久 
            if(!vis[i][j]&&(mp[i][j]=='k'||mp[i][j]=='v')){
                bfs(i,j);
            }
        }
    }
    //直接输出就好了 
    cout<<w<<" "<<s;
    return 0;
}

顺便说一句,其实羊会功夫也没什么了不起,中国的熊猫也会。

posted @ 2023-08-28 10:32  very_easy  阅读(12)  评论(0)    收藏  举报  来源