SDJZUOJ 2140 Oil Deposit
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1241
http://sdjzu.acmclub.com/index.php?app=problem_title&id=147&cid=1028&problem_id=2140&cpid=B
搜索水(DFS、BFS皆可)
题目大意:开采油田,连在一块的油田算一块,问图中总共有几块分开的油田。
题目分析:我用的DFS
code:
#include<stdio.h>
char c[105][105];//在二维上有8个方向
int m,n,dir[8][2]={1,0,-1,0,0,1,0,-1,1,1,1,-1,-1,1,-1,-1};
void dfs(int x,int y)
{
int i,xx,yy;
for(i=0;i<8;i++)
{
xx=x+dir[i][0];
yy=y+dir[i][1];
if(c[xx][yy]=='@'&&xx>=0&&yy>=0&&xx<m&&yy<n)
{
c[xx][yy]='*';
dfs(xx,yy);
}
}
}
int main()
{
int i,j,counter;
while(scanf("%d%d",&m,&n)!=EOF&&m)
{
counter=0;
for(i=0;i<m;i++)
{
getchar();
scanf("%s",c[i]);
}
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(c[i][j]=='@'){counter++;dfs(i,j);}
}
}
printf("%d\n",counter);
}
}
在网上查这道题还有用BFS做的。
code:
/*
这题题意很明确,但是不容易读,通俗来说就是要你找一共有几个@相连的块.
相连的意思是指上下左右斜
输入后把不是*的mar标记false
然后进行广度搜索.第一次做的话肯定是有点难度,会了就很简单了
*/
#include <stdio.h>
#include <queue>
using namespace std;
#define N 101
int po[9][2] = { { 0, 0 }, { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 }, { 1, -1 },
{ 1, 1 }, { -1, -1 }, { -1, 1 } };
//存储坐标变化的八种情况
struct E {
int a, b;
void set(int x, int y) {
a = x;
b = y;
}
};
//定义坐标结构体,好加入队列
char s[N][N];
bool mar[N][N];
int a, b;
int n, m;
queue<E> Q;
void BFS() {
E tm, t;
while (!Q.empty()) {
tm = Q.front();
Q.pop();
for(int i = 1; i <= 8; i++){
a = tm.a; b = tm.b;
a += po[i][0];b += po[i][1];
if(a >= 0 && a < n && b >= 0 && b <= m && !mar[a][b]){
mar[a][b] = true;
t.set(a, b);
Q.push(t);
}
}
}
}
int main() {
int count;
E t;
while (~scanf("%d%d", &n, &m) && !(!n && !m)) {
count = 0;
getchar();
for (int i = 0; i < n; i++)
scanf("%s", s[i]);
for (int i = 0; i < n; i++)
for (int k = 0; k < m; k++)
mar[i][k] = s[i][k] != '@';
for (int i = 0; i < n; i++)
for (int k = 0; k < m; k++) {
if (!mar[i][k]) {
t.set(i, k);
Q.push(t);
BFS();
count++;
}
}
printf("%d\n",count);
}
return 0;
}
PS:一拿到题想都没想就BF了,然后wrong answer,不知道是算法有问题还是别的什么……