当前位置: 代码迷 >> 综合 >> 2022-3-7
  详细解决方案

2022-3-7

热度:15   发布时间:2023-11-29 21:38:57.0

灌溉

题目描述

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

花园可以看成一个 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.6180335&&n<=0.6180344) break;c=a+b;a=b;b=c;} cout<<a<<"/"<<b<<endl;return 0;
}