Ovce过不了啊啊啊啊啊

HYF 家的后院养着一群羊,HYF 由于疲劳睡着了,这时一群饿狼钻进了后院开始攻击羊群,后院是由许多个方格构成的长方形区域,每个方格中用字符’.’表示空地,'#’表示栅栏,'o’表示羊,'v’表示狼,羊和狼所在的格子都是空地。

如果从一个空地A沿着水平方向或垂直方向经过一系列的空地能够到达空地 B,则称空地A和空地B属于同一个羊圈。对于能够逃离后院的空地我们认为它不属于任何一个羊圈。

当一个羊圈中羊的数量大于狼的数量时,它们会用它们的尖角顶死该羊圈中的狼,否则就将被狼吃掉,最后每个羊圈中只会剩下一种动物。
【输入文件】

第一行包含两个用空格隔开的自然数 R 和 C,R 表示 HYF 家后院的行数,C表示列数,接下来的R行每行包含C个字符,每个字符表示一个格子的情况。

【输出文件】

仅一行,包含两个用一个空格隔开的整数,表示剩余的羊的数量和狼的数量。

【数据规模】

30%的数据:

,

<

30
R,C<=30

100%的数据:
3
<


,

<

250
3<=R,C<=250

#include <bits/stdc++.h>
using namespace std;
int n,m,ans1,ans2;
char a[300][300];
bool vis[300][300];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};

void bfs(int x,int y){
  queue<pair<int ,int>> q;
  q.push({x,y});
  vis[x][y]=true;
  int res1=0,res2=0;
  while(!q.empty()){
    auto t=q.front();
    q.pop();
    int xx=t.first;
    int yy=t.second;
    if(a[xx][yy]=='o'){
      res1++;
    }
    else if(a[xx][yy]=='v'){
      res2++;
    }
    for(int i=0;i<4;i++){
      int tx=xx+dx[i];
      int ty=yy+dy[i];
      if(tx<1||tx>n||ty<1||ty>m||vis[tx][ty]||a[tx][ty]=='#') continue;
      q.push({tx,ty});
      vis[tx][ty]=true;
    }
  }
  if(res1>res2){
    ans1+=res1;
  }
  else{
    ans2+=res2;
  }
}

int main(){
  cin>>n>>m;
  for(int i=1;i<n;i++){
    for(int j=1;j<=m;j++){
      cin>>a[i][j];
    }
  }
  for(int i=1;i<n;i++){
    for(int j=1;j<=m;j++){
      if(!vis[i][j]&&a[i][j]!='#'){
        bfs(i,j);
      }
    }
  }
  cout<<ans1<<" "<<ans2;
  return 0;
}
1 个赞

你的输入为什么是从1~n-1?
而且你没有考虑到此点可以逃离后院的情况
你可以从边缘开始BFS,这个点能到达的点都是可以逃离后院的,不计入统计
然后再按照你的思路来写

2 个赞

thanks

1 个赞