hdu1241&&SDJZUOJ 2140 Oil Deposit

36 篇文章 0 订阅

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,不知道是算法有问题还是别的什么……






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值