https://vjudge.net/problem/UVA-572
https://vjudge.net/problem/HDU-1241
思路:
这俩是一样的,主函数内循环遍历每个块,若该块有油且未标记,ans++并作为起点dfs,将可到达的油田全部标记,输出ans
这里提供两种 八向走法 的代码:
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
if(i||j) DFS(x+i,y+j);
int dx[] = {0, 0,1,-1,1, 1,-1,-1};
int dy[] = {1,-1,0, 0,1,-1, 1,-1};
for(int i = 0; i < 8; i++) {
int mx = x + dx[i];
int my = y + dy[i];
}
用哪个都可以,以下代码供参考:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include<iomanip>
#include <stack>
#include <queue>
using namespace std;
int dx[] = {0, 0,1,-1,1, 1,-1,-1};
int dy[] = {1,-1,0, 0,1,-1, 1,-1};
bool vis[110][110];
string s[110];
int r, c;
void dfs (int x, int y) {
vis[x][y] = true;//标记
for(int i = 0; i < 8; i++) {
int mx = x + dx[i];
int my = y + dy[i];
if(mx>=0 && mx<r && my>=0 &&my<c)
if(s[mx][my] == '@' && !vis[mx][my]) dfs(mx,my);
}
}
int main() {
while(cin>>r>>c && r) {
int ans = 0;
memset(vis, 0, sizeof(vis));
for(int i = 0; i < r; i++) cin >> s[i];
for(int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
if(s[i][j] == '@' && !vis[i][j]) {
dfs(i,j); ans++;//此处统计
}
cout << ans << endl;
}
return 0;
}