深搜 城堡 方格

百练 2815
城堡问题
查看 提交 统计 提示 提问
总时间限制: 1000ms 内存限制: 65536kB
描述

 1   2   3   4   5   6   7  

#############################
1 # | # | # | | #
#####—#####—#—#####—#
2 # # | # # # # #
#—#####—#####—#####—#
3 # | | # # # # #
#—#########—#####—#—#
4 # # | | | | # #
#############################
(图 1)

# = Wall
| = No wall
- = No wall

图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~4面墙。
输入
程序从标准输入设备读入数据。第一行是两个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数字表示方块周围的墙,1表示西墙,2表示北墙,4表示东墙,8表示南墙。每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。输入的数据保证城堡至少有两个房间。
输出
城堡的房间数、城堡中最大房间所包括的方块数。结果显示在标准输出设备上。
样例输入
4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
样例输出
5
9

#include <iostream>
#include <stdlib.h>
#include <cstring>
using namespace std;
int room[60][60];
int col[60][60];//方块是否被标记过
int r,c;
int roomar,roomnum=0,maxroomar=0;//当前方块
void dfs(int i,int k)
{
    if(col[i][k])
        return ;
    roomar++;
    col[i][k]=roomnum;
    //只要与1 不同就是0
    if ((room[i][k]&1)==0) dfs(i,k-1);//向西走
    if ((room[i][k]&2)==0) dfs(i-1,k);//向北走
    if ((room[i][k]&4)==0) dfs(i,k+1);//东
    if ((room[i][k]&8)==0) dfs(i+1,k);//南
}
int main()
{
    cin>>r>>c;
    for(int i=1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
        {
            cin>>room[i][j];
        }
    }
    memset(col,0,sizeof(col));
    for (int i=1;i<=r;i++)
    {
        for (int k=1;k<=c;k++)
        {
            if(!col[i][k])
            {
                roomnum++; roomar=0;
                dfs(i,k);
                maxroomar=max(maxroomar,roomar);//更新最大方块数
            }
        }
    }
    cout<<roomnum<<endl;
    cout<<maxroomar<<endl;
    system("pause");
    return 0;
}

百练4103:踩方格
查看 提交 统计 提示 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b. 走过的格子立即塌陷无法再走第二次;
c. 只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。

输入
允许在方格上行走的步数n(n <= 20)
输出
计算出的方案数量
样例输入
2
样例输出
7

#include <iostream>
#include <stdlib.h>
#include <cstring>
using namespace std;
int num[40][60];
int n;
int way(int i,int j,int n)
{
    if (n==0)
        return 1;
    num[i][j]=1;
    int nu=0;
    if (!num[i][j+1]) nu+=way(i,j+1,n-1);//东
    if (!num[i][j-1]) nu+=way(i,j-1,n-1);//西
    if(!num[i+1][j]) nu+=way(i+1,j,n-1);//北
    num[i][j]=0;
    return nu;
}
int main()
{
    cin>>n;
    memset(num,0,sizeof(num));
    cout<<way(0,30,n)<<endl;
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40823992/article/details/81710385