城堡 The Castle

城堡 The Castle

洛谷P1457

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
唉 这道题不是特别难 就是要求输出太多 无奈之下写了90行

在这里插入图片描述

算了 今天在代码上写注释吧

#include <iostream>
using namespace std;
int n,m,cnt,area,marea=0,dir;
int w[55][55],f[55][55]; // w记录墙 f就是flag
int dx[4]={0,-1,0,1}; // 这个数组用来为x轴随时判断方向
int dy[4]={-1,0,1,0}; // 这个数组用来为y轴随时判断方向
int harea [2505]; // 

void dfs (int x,int y) // 深搜
{
    if (x<1 || y<1 || x>n || y>m || f[x][y]) return; // 如果越界就返回
    f[x][y]=cnt; // 判断这个屋子结束了
    harea[cnt]++; // 记录这个屋子的大小
    for (int i=0;i<=3;i++)
        if (!((w[x][y]>>i)&1)) dfs(x+dx[i],y+dy[i]); // 判断这个房间的上下左右
}
int main ()
{
    cin >> m >> n;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            cin >> w[i][j];
    
    for (int j=1;j<=m;j++) // 这里其实暴力就可以 不用非这么写
        for (int i=n;i>0;i--)
            if (f[i][j]==0) // 如果没有检测过
            {
                cnt++;// 房间数目++
                dfs (i,j); // 判断这个房间
                if (harea[cnt]>marea) // 如果这个房间的大小是目前最大的
                    marea=harea[cnt]; // 记录下来
            }
    
    
    cout << cnt << endl; // 第一问
    cout << marea << endl; // 第二问
    
    int x=0,y=0;
    for (int j=1;j<=m;j++) // 优先选西和南
    {
        for (int i=n;i>0;i--)
        {
            if ((w[i][j]>>1)&1) // 如果有北墙
            {
                if (f[i][j]!=f[i-1][j]) // 且不是同一房间
                {
                    int a1 = harea[f[i][j]],a2=harea[f[i-1][j]]; // 分别记录两个房间的大小
                    if (a1+a2>marea) // 如果加起来更大
                    {
                        marea=a1+a2; // 更新记录!
                        x=i;
                        y=j;
                        dir=1; // 确定啦 就是你北墙!
                    }
                }
            }
            if ((w[i][j]>>2)&1) // 如果有东墙
            {
                if (f[i][j]!=f[i][j+1]) // 且不是同一房间
                {
                    int a1 = harea[f[i][j]],a2=harea[f[i][j+1]]; // 分别记录二个房间的大小
                    if (a1+a2>marea) // 如果加起来更大
                    {
                        marea=a1+a2; // 更新记录!
                        x=i;
                        y=j;
                        dir=2; // 确定啦 就是你东墙
                    }
                }
            }
        }
    }
    cout << marea << endl; // 第三问
    cout << x  << " " << y << " ";
    if (dir==1)
        cout << "N" << endl; // 第四问
    else
        cout << "E" << endl;
    return 0;
    
    
}

好啦 就这样结束啦(终于)

😶

此题解已AC,也欢迎指出更多优化方法~

❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值