北大 算法基础
百练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));//向下
}
}
}