DFS.03-城堡问题

城堡问题

在这里插入图片描述
问题描述:计算城堡一共有多少个房间,最大的房间有多大
------------------ 1 表示西墙,2 表示北墙,4 表示东墙,8 表示南墙
-------------------每个方块用代表其周围墙的数字之和表示

思路

从第一个房间 ( 1 , 1 ) 入手,发现东门不存在,向东走
进入第二个房间(1,2),判断门的状态
若DEADEND,return,回溯,循环+1

代码实现

#include<cmath>
#include<cstring>
#include<stack> 
#include<stdio.h> 
using namespace std;
int color[100][100];
int map[100][100]; 
int maxroomA=0 ;
int roomarea;//过程量 
int roomnum=0;
int R,C;

void dfs(int i,int j){
 if(color[i][j])//走过的 
   return;
 else{
  color[i][j]=1;
  roomarea+=1;

  if((map[i][j]&1)==0) dfs(i,j-1);
  if((map[i][j]&2)==0) dfs(i-1,j);
  if((map[i][j]&4)==0) dfs(i,j+1);
  if((map[i][j]&8)==0) dfs(i+1,j);
  } 
}

int main(){
    scanf("%d %d",&R,&C);
 
 for(int i=1;i<=R;++i)
 {
    for(int j=1;j<=C;++j)
       scanf("%d",&map[i][j]);
    printf("\n");
 }

memset(color,0,sizeof(color));//把标志数组初始化
    
for(int i=1;i<=R;++i){//i,j置1,防止越界! 
    for(int j=1;j<=C;++j){
        if(!color[i][j]){
           roomnum+= 1;//开始新的搜索说明房间数+1 
           roomarea= 0;//记录该房间的面积 
           dfs(i,j);
           maxroomA=max(roomarea,maxroomA);//更新最大面积 
           //写在if范维内,因为roomarea只在if内生效 
          }   
       }
   }
printf("%d %d",maxroomA,roomnum);
    return 0;  
} 

新学到的语法知识

逻辑运算
’ & ’ : 与运算,按位进行,若都为1,则为1,有一个为0则为0
-------1 & 1 =1 ; 1 & 0 = 0 ; 0 & 1 = 0 ; 0 & 0 = 0
-------用 0 对原存储单位清零 ; 用 保留特殊位 (常见最大值)
’ ^ ’ : 异或计算,按位进行,0异或任何数=任何数,1异或任何数=任何数取反,任何数异或自己=0
--------1 ^ 1 = 0 ; 0 ^ 0 = 0 ; 1 ^ 0 = 1 ; 0 ^ 1 = 1
--------利用特殊数对特定位翻转 ; 与(00000000)异或保持原值 ;交换两个实际值而不是名称
’ | ’ : 或运算,按位进行,有一个为1,则为1
-------1 | 1 = 1 ;1 | 0 = 1 ;0 | 1 = 1 ;0 | 0 = 0
-------对一个数据的某些特定位 定为1
’ << ’ : 左移运算,按位进行,用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
-------左移1位 = 该数乘以2,左移2位 = 该数乘以2*2=4, 15<<2=60 但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况
’ >> ’ : 右移运算,按位进行,用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。

心得

这个程序是先听老师讲了例题再写的,讲过之后也没有完整的写出,写了个大体框架吧
再看这道题觉得思路蛮顺的
但是看到墙的数字表示反应不过来是利用二进制,还需磨练

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值