ZOJ Problem Set - 1709 Oil Deposits

一开始暴力,WA 了很多次,后来发现一大堆的漏洞,修补之后发现不行。才想到搜索之,所以改用BFS。A了!但是却耗费一大堆时间。

BFS的思路是一轮一轮的找同一个油田的洞口,记录总共找了多少轮就行了!

总结: 这种图的最好一开始就先用搜索试试!DFS或BFS!暴力实在坑爹! 发现BFS不够熟悉!

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
char ch[101][101];
int cot[101][101];
int m,n;
struct node
{
      int x;
      int y;
};
queue<node>q;
int main()
{
    int i,j,ii,jj,k;
    node s,t;
    while(cin>>m>>n&&m!=0)
    {
          k = 0;
          for(i = 0;i < m;i ++)
          for(j = 0;j < n;j ++)
          cin>>ch[i][j];
          memset(cot,0,sizeof(cot));
          for(i = 0;i < m;i ++)
          for(j = 0;j < n;j ++)
          {
                if(ch[i][j] == '@'&&cot[i][j] == 0)
                {
                      cot[i][j] = ++k;
                      s.x = i;
                      s.y = j;
                      q.push(s);
                      while(!q.empty())
                      {
                            t = q.front();q.pop();
                            //cout<<t.x<<" "<<t.y<<endl;
                            for(ii = t.x -1;ii <= t.x+1;ii ++)
                            for(jj = t.y -1;jj <= t.y+1;jj ++)
                            {
                                  if(ii>=0&&jj>=0&&ch[ii][jj] == '@'&&cot[ii][jj]==0)
                                  {

                                        s.x = ii;
                                        s.y = jj;
                                        q.push(s);
                                        cot[ii][jj] = k;
                                  }
                            }

                      }

                }
          }
          cout<<k<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值