1011 Oil Deposits

来源:互联网 发布:win7带网络的安全模式 编辑:程序博客网 时间:2024/05/20 10:16

题意:
上下左右左上右上左下右下只要有一个方向@可以连起来就算是一块,求有多少块油田
思路:
上课讲过的题,用BFS深搜 每找到一个@就搜索它附近所有的@ 并且标记访问函数为1(已经访问过) 访问过的不再访问 每找到一块 总数加一

虽然上课见过了 代码写起来也好麻烦 全是些小错误。。什么终止运行啥的!!。。。。。。真麻烦。。。

#include "stdafx.h"#include<fstream>#include <iostream>#include <cstring>    using namespace std;bool visit[110][110];   char a[110][110];    int dir[8][2] = { { -1,0 },{ 1,0 },{ 0,1 },{ 0,-1 },{ -1,-1 },{ -1,1 },{ 1,-1 },{ 1,1 } };  int sum, m, n, sx, sy;bool f(int a, int b) {        if (a<1 || a>m || b<1 || b>n)return true;    return false;}void dfs(int sx, int sy) {       for (int i = 0;i<8;i++)    {        if (a[sx + dir[i][0]][sy + dir[i][1]] == '*')continue;        if (f(sx + dir[i][0], sy + dir[i][1]))continue;        if (visit[sx + dir[i][0]][sy + dir[i][1]])continue;         visit[sx + dir[i][0]][sy + dir[i][1]] = 1;           dfs(sx + dir[i][0], sy + dir[i][1]);    }}int main(){    fstream cin("E:/C++/IN/aaa.txt");    while (cin >> m >> n)    {        sum = 0;        if (m == 0)break;        memset(visit, 0, sizeof(visit));        for (int i = 1;i <= m;i++)             for (int j = 1;j <= n;j++)             {                cin >> a[i][j];            }        for (int i = 1;i <= m;i++)         {                 for (int j = 1;j <= n;j++)              {                if (a[i][j] == '@'&& !visit[i][j])                 {                     visit[i][j] = 1; dfs(i, j);                    sum++;                  }            }        }        cout << sum << endl;    }    return 0;}
0 0
原创粉丝点击