0
点赞
收藏
分享

微信扫一扫

2022-3-7

西街小学的王 2022-03-11 阅读 53
蓝桥杯c++

灌溉

题目描述

小蓝负责花园的灌溉工作。

花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。

小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。

每经过一分钟,水就会向四面扩展一个方格,被扩展到的方格可以被认为已经灌溉好。即如果前一分钟某一个方格被灌溉好,则下一分钟它上下左右的四个方格也被灌溉好。

给定花园水管的位置,请问 k 分钟后,有多少个方格被灌溉好?

输入描述

输入的第一行包含两个整数 n,m。

第二行包含一个整数 t,表示出水管的数量。

接下来 t 行描述出水管的位置,其中第 i 行包含两个数 r,c 表示第 r 行第 c 列有一个排水管。

接下来一行包含一个整数 k。

其中,1≤n,m≤100,1≤t≤10,1≤k≤100。

输出描述

输出一个整数,表示答案。

3 6
2
2 2
3 4
1

9
#include <iostream>
using namespace std;

//灌溉
int a[105][105];
void water(int i,int j){//向四周浇水
a[i][j]=1;
if(a[i-1][j]==0) a[i-1][j]=1;
if(a[i+1][j]==0) a[i+1][j]=1;
if(a[i][j-1]==0) a[i][j-1]=1;
if(a[i][j+1]==0) a[i][j+1]=1;
}
int main()
{
int n,m,t,k;
cin>>n>>m>>t;
while(t--){//第一分钟有水管的地方浇水完成
int r,c;
cin>>r>>c;
water(r,c);
}
cin>>k;
int g=k-1;
if(k>1){//1分钟后已经交好水的地方开始向四周浇水
while(g--){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1)
water(i,j);
}
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==1)
ans++;
}
}
cout<<ans<<endl;
return 0;
}

扫雷

题目描述

在一个 n 行 m 列的方格图上有一些位置有地雷,另外一些位置为空。

请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。

输入描述

输入的第一行包含两个整数 n,m。

第 2 行到第 n+1 行每行包含 m 个整数,相邻整数之间用一个空格分隔。如果对应的整数为 0,表示这一格没有地雷。如果对应的整数为 1,表示这一格有地雷。

其中,1≤n,m≤100 分钟后还是在当天。

输出描述

输出 n 行,每行 m 个整数,相邻整数之间用空格分隔。

对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出 9。

3 4
0 1 0 0
1 0 1 0
0 0 1 0

2 9 2 1
9 4 9 2
1 3 9 2
#include <iostream>
using namespace std;

//扫雷
#include<cstring>
int mp[105][105],ans[105][105],n,m;
int mineswaper(int x,int y){
int num=0;
if(mp[x][y]==0){
if(mp[x-1][y]==1) num++;
if(mp[x+1][y]==1) num++;
if(mp[x][y-1]==1) num++;
if(mp[x][y+1]==1) num++;
if(mp[x-1][y-1]==1) num++;
if(mp[x-1][y+1]==1) num++;
if(mp[x+1][y-1]==1) num++;
if(mp[x+1][y+1]==1) num++;
}
return num;
}
int main()
{
cin>>n>>m;
memset(mp,0,sizeof(mp));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]==1) ans[i][j]=9;
else ans[i][j]=mineswaper(i,j);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<ans[i][j]<<" ";
}
cout<<endl;
}
return 0;
}

矩形切割

题目描述

小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。

当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方 形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止

例如,对于一块两边分别为 5 和 3 的材料(记为 5×3),小明会依次切出 3×3、2×2、1×1、1×1 共 4 个正方形。

现在小明有一块矩形的材料,两边长分别是 2019 和 324。请问小明最终会切出多少个正方形?

#include <iostream>
using namespace std;

//矩形切割
int main()
{
int r=2019,c=324,ans=0;
while(r-c!=0){
ans++;
r=r-c,c=c;
if(r<c) swap(r,c);
}
if(r==c) ans++;
cout<<ans<<endl;
return 0;
}

鲁卡斯队列

题目描述

黄金分割数 0.618 与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的 0.618 处,墙上的画像一般也挂在房间高度的 0.618 处,甚至股票的波动据说也能找到 0.618 的影子....

黄金分割数是个无理数,也就是无法表示为两个整数的比值。0.618 只是它的近似值,其真值可以通过对 5 开方减去 1 再除以 2 来获得,我们取它的一个较精确的近似值:0.618034。

有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊!

1 3 4 7 11 18 29 47.... 称为“鲁卡斯队列”。它后面的每一个项都是前边两项的和。

如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 ...1/3,3/4,4/7,7/11,11/18...会发现它越来越接近于黄金分割数!

你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与 0.618034 一致的精度。

请写出该比值。格式是:分子/分母。比如:29/47。

与四舍五入的数字进行比较是,找出未知量保留相应位数四舍五入后等于该数字的范围

#include <iostream>
using namespace std;

//鲁卡斯队列(固定精度小数比较时)
int main()
{
float a=1,b=3,c=0,n;
while(1){
n=a/b;
if(n>=0.61803350.6180344) break;
c=a+b;
a=b;
b=c;
}
cout<<a<<"/"<<b<<endl;
return 0;
}
举报

相关推荐

0 条评论