1562:Oil Deposits

照着ppt抄写的

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

char mat[101][101];
bool vis[101][101];
int queHead, queTail;
int dx[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dy[] = { -1, 0, 1, -1, 1, -1, 0, 1 };

class Node
{
public:
	int x, y;
	Node(){};
	Node(int x, int y) :x(x), y(y){}
	//判定当前位置是否在地图范围内

	bool isInMap(int m, int n)
	{
		return x < m&&x >= 0 && y < n&&y >= 0;
	}
}que[10000];

void bfs(int x, int y, int m, int n)
{
	queHead = queTail = 0;//清空队列
	que[queTail++] = Node(x, y);//将(x,y)加入队列
	vis[x][y] = true;
	for (; queHead < queTail;queHead++)
	for (int i = 0; i < 8; i++)
	{
		Node nxt(que[queHead].x + dx[i], que[queHead].y + dy[i]);
		if (nxt.isInMap(m, n) && !vis[nxt.x][nxt.y] && mat[nxt.x][nxt.y] == '@')
		{
			que[queTail++] = nxt;
			vis[nxt.x][nxt.y] = true;
		}
	}
}


int main()
{
	int ret = 0, m, n;
	while (true)
	{
		ret = 0;
		memset(vis, 0, sizeof(vis));
		cin >> m >> n;
		
		if (m == 0 && n == 0)
			break;

		for (int i = 0; i < m; i++)
		for (int j = 0; j < n; j++)
			cin >> mat[i][j];

		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (mat[i][j] == '@'&&!vis[i][j])
				{
					bfs(i, j, m, n);
					ret++;
				}
			}
		}

		printf("%d\n", ret);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值