北大 算法基础 百练2815 城堡问题

北大 算法基础
百练2815 城堡问题练习代码

#include<iostream> 
using namespace std;

int R, C;
int rooms[60][60];//方格内的数值
int color[60][60];//颜色标记
int roomNum=0, roomArea;//当前房间序数,当前房间面积(数量)数值
int maxRoomArea=0;
void Dfs(int i, int k) {
	if (color[i][k]) return;
	++roomArea;//找到空格子,增加面积数
	color[i][k] = roomNum;//当前格子标记上当前房间数
	if (((rooms[i][k] & 1) == 0) & k-1>0) Dfs(i, k - 1);//左边没有墙,向左走一格
	if (((rooms[i][k] & 2) == 0) & i-1>0) Dfs(i - 1, k);//向上走
	if (((rooms[i][k] & 4) == 0) & k+1<=C) Dfs(i, k+1);//向右走
	if (((rooms[i][k] & 8) == 0) & i+1<=R) Dfs(i + 1, k);//向下走
}
int main() {
	cin >> R >> C;
	for (int i=1; i <= R; i++)
		for (int k=1; k <= C; k++)
			cin >> rooms[i][k];
	memset(color, 0, sizeof(color));
	for(int i=1;i<=R;i++)
		for(int k=1;k<=C;k++)
			if (!color[i][k]) {//方格没有标记颜色时循环
				++roomNum;
				roomArea = 0;
				Dfs(i, k);
				maxRoomArea = max(maxRoomArea, roomArea);
			}
	cout << roomNum << endl;;
	cout << maxRoomArea << endl;	
	return 0;
}

用栈改写Dfs函数

void Dfs(int i, int k) {
	struct Room { int r, c; Room(int rr, int cc) :r(rr), c(cc) {} };
	stack<Room> stk;
	stk.push(Room(i, k));
	while (!stk.empty()) {
		Room rm=stk.top();//取栈顶的值
		int i = rm.r;
		int k = rm.c;
		if (color[i][k]) stk.pop();//已标记颜色,弹出栈
		else {
			color[i][k] = roomNum;//标记颜色
			roomArea++;
			if (((rooms[i][k] & 1) == 0) & k - 1 > 0) stk.push(Room(i, k - 1));//向左走
			if (((rooms[i][k] & 2) == 0) & i - 1 > 0) stk.push(Room(i - 1, k));//向上
			if (((rooms[i][k] & 4) == 0) & k + 1 <= C) stk.push(Room(i, k + 1));//向右
			if (((rooms[i][k] & 8) == 0) & i + 1 <= R) stk.push(Room(i + 1, k));//向下

		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值