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;
}
顺便说一句,其实羊会功夫也没什么了不起,中国的熊猫也会。