您的位置:首页 > 其它

hdu1241

2015-07-30 20:49 519 查看
搜索

#include <iostream>

#include <string>

#include <algorithm>

#include <cstdio>

#include <vector>

#include <map>

#include <iterator>

#include <cstring>

#include <cmath>

using namespace std;

char maze[105][105];

int m, n;

int num;

int visit[105][105];

int dx[] = {-1,-1,-1,0,0,1,1,1}, dy[] = {-1,0,1,-1,1,-1,0,1};

class point {

public:

int x;

int y;

point(int x, int y) {

this->x = x, this->y = y;

}

};

vector<point> oils;

int isvalid(int x, int y) {

return x >=0 && y >=0 && x <m && y <n && !visit[x][y] && maze[x][y] == '@';

}

void dfs(int x, int y, int initial) {

if (visit[x][y]) {

// printf("(%d, %d) has been visited..\n", x, y);

return;

}

// printf("start dfs at (%d, %d)\n", x, y);

if (initial) {num++;}

// printf("at (%d, %d), num++...\n", x, y);}

visit[x][y] = 1;

int nx, ny;

for (int i = 0; i < 8; i++) {

nx = x+dx[i], ny = y+dy[i];

if (isvalid(nx, ny)) {

// printf("from (%d, %d) to (%d, %d)\n",x, y, nx, ny);

dfs(nx, ny, 0);

}

}

}

int main() {

while (cin >> m >> n && (m||n)) {

oils.clear();

for (int i = 0; i < m; i++) {

cin >> maze[i];

for (int j = 0; j < n; j++) {

if (maze[i][j] == '@')

oils.push_back(point(i,j));

}

}

memset(visit, 0, sizeof(visit));

num = 0;

for (int i = 0; i < oils.size(); i++) {

dfs(oils[i].x, oils[i].y, 1);

}

cout << num << endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: