北大程序设计与算法慕课上的一道题,注意用1,2,4,8这些2的次方数来储存城墙的信息,应联想到二进制的每一位的0或1可以代表那个方向有没有墙。使用和1,2,4,8的按位与就可以。注意运算符顺序!!!一定要随手加括号!!!
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
int roomcnt=0;
int roomerea=0;
using namespace std;
int g[60][60];
int vis[60][60];
void dfs(int i,int j)
{
if(vis[i][j]!=0) return ;
vis[i][j]=1;//vis[i][j]也可等于roomcnt来记录是属于哪个大房间
roomerea++;
if((g[i][j]&1)==0) dfs(i,j-1); //去掉括号g[i][j]&1==0答案错!
if((g[i][j]&2)==0) dfs(i-1,j); //不用判断边界情况,本身就含有所有墙的信息了
if((g[i][j]&4)==0) dfs(i,j+1);
if((g[i][j]&8)==0) dfs(i+1,j);
}
int main()
{
int r,c;
cin>>r>>c;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
cin>>g[i][j];
memset(vis,0,sizeof(vis));
int maxerea=0;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
if(vis[i][j]==0){
roomerea=0;
roomcnt++;
dfs(i,j);//习惯性地写了dfs[i][j]没进入dfs函数,检查了半天dfs函数发现是这里的引用问题
maxerea=max(maxerea,roomerea);
}
cout<<roomcnt<<endl;
cout<<maxerea<<endl;
}