説明
狼は群れの開始裏庭のグループに入ったときにミッキー所有者の裏庭の群れは、ミッキーが眠っ疲労に、裏庭は正方形からなる多くの矩形領域、各正方形で構成されています「?」の文字とのオープンスペースを意味し、「#」「はV」は、格子狼、羊やオープンスペースを設置している狼を表し、「O」は羊を表し、フェンスを示しています。オープンスペースの一連の水平方向または垂直方向から空間Aは、空間Bに到達することができた場合は、サイトAとサイトBは同じ倍に属していると言われています。裏庭のオープンスペースから脱出できるようにするために、我々はそれがいずれかのsheepfoldにも属していないと思います。オオカミ、彼らはそれ以外の場合は、オオカミに食われる、彼らの鋭い角がsheepfoldで死んでオオカミをトップに使用するよりも大きな倍で羊の数は、各sheepfoldの終わりは去るとき動物。すべてのプログラム終了後の倍で羊と狼の合計数は、統計的な戦いを書き込みます。
入力
最初の行は、空間R及び3 <= R、C <= C、で区切られた2つの自然数含ま 250、Rが裏庭ミッキーラインを表し、Cは列の数、次のRライン表す
行ごとに各ケースは、グリッドを表し、Cの文字が含まれています。
出力
だけ含む1~2狼と羊要件の数を表す空間の整数だけ離れ。
サンプル入力
9 12
.###.#####..
#.oo#...#v#.
#..o#.#.#.#.
#..##o#...#.
#.#v#o###.#.
#..#v#....#.
#...v#v####.
.####.#vv.o#
.......####.
サンプル出力
3 5
この質問のEMMは、BFSの水の問題が、しかし、ポイントカード私に長い時間があります。
私が間違っているものを見ることができないビューの兄は、おそらく考えて部屋を見つけるために私のコードは常にTLEの始まりは、この次のとおりです。
入力 - >出力統計 - >隣接は##になっていません - >この1つは羊と狼の数を数えBFS>#bfs-には見られない、もう一度マップをトラバース
最後に、私は...、治療チームのヘッドはTLEので、チェンジ#をカウントされたときにカウントし、このセクションでは、しばらく始まるBFSに配置された#となって私のコードは、それが、ある発見
に、この1つの変更動作しているときにキューに、実際に24ms水が通過しました!
コードは、涙の2行は、WAを標準化されていません!
以下は、コード部分のEMMであります
#include<bits/stdc++.h>
using namespace std;
int n,m;
int lang,yang;//awa
char mp[258][258];
struct node
{
int x,y;
};
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void bfs(int x,int y)
{
int nl=0,ny=0;//now_lang,now_yang
queue<node> q;
q.push((node){x,y});
if(mp[x][y]=='o')ny++;
else if(mp[x][y]=='v')nl++;
mp[x][y]='#';
while(!q.empty())
{
node now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int tx=now.x+dir[i][0],ty=now.y+dir[i][1];
if(mp[tx][ty]!='#'&&1<=tx&&tx<=n&&1<=ty&&ty<=m)
{
q.push((node){tx,ty});
if(mp[tx][ty]=='o')ny++;
else if(mp[tx][ty]=='v')nl++;
mp[tx][ty]='#';
}
}
}
if(ny>nl)yang+=ny;
else lang+=nl;
}
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(mp[i][j]!='#')bfs(i,j);
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// {
// cout<<mp[i][j];
// }
// cout<<endl;
// }
cout<<yang<<" "<<lang<<endl;
return 0;
}
PSひどい阿波部分は、独自のスキップ