百练 2815
城堡问题
查看 提交 统计 提示 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
1 2 3 4 5 6 7
#############################
1 # | # | # | | #
#####—#####—#—#####—#
2 # # | # # # # #
#—#####—#####—#####—#
3 # | | # # # # #
#—#########—#####—#—#
4 # # | | | | # #
#############################
(图 1)
# = Wall
| = No wall
- = No wall
图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成mn(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;
}