[ソリューション]問題のオオカミと羊-C ++

説明
狼は群れの開始裏庭のグループに入ったときにミッキー所有者の裏庭の群れは、ミッキーが眠っ疲労に、裏庭は正方形からなる多くの矩形領域、各正方形で構成されています「?」の文字とのオープンスペースを意味し、「#」「は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ひどい阿波部分は、独自のスキップ

おすすめ

転載: www.cnblogs.com/moyujiang/p/11225621.html