【蓝桥杯省赛】第十一届蓝桥杯省赛C/C++大学B组第二场 试题C 蛇形填数

如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 :::
3 5 8 14 :::
4 9 13 :::
10 12 :::
11 :::
:::
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列
的数是多少 ?
这题看完之后
就一个想法必须做出来
10分不是白送吗
不知道是不是脑抽
懒得写代码
在excel里
输入了每个边界
然后去看
不知道是哪个边界输错了还是咋的
最后数了765
答案761
真是吐了

解法一

对角线是个有规律的数列
1 5 13  ...
所以简单一算就可以出结果

解法二

#include<iostream>
using namespace std;
int m,n,x,y;
int a[40][40];
int main(){
	int count=1;
	int num=1;
	while(true){
		if(count%2==0){
			for(int i=1;i<=count;i++){
			for(int j=1;j<=count;j++){
				if(i+j==count+1){
					a[i][j]=num++;
				}
			}
		}	
		}else{
			for(int i=count;i>=1;i--){
			for(int j=count;j>=1;j--){
				if(i+j==count+1){
					a[i][j]=num++;
				}
			}
		}
		}
		if(a[20][20]){
			cout<<a[20][20]<<endl;
			break;
		}
		count++;
	}
	return 0;
}
校内天梯赛对这个题进行改编
也是蛇形矩阵,其中输入m,n,x,y分别表示矩阵行数,矩阵列数,要求输出元素所在行,要求输出元素所在列(下标从1开始)
输入样例
4 4 3 3
输出样例
12
解释 图形如下
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
#include<iostream>
using namespace std;
int m,n,x,y;
int a[105][105];
int main(){
	cin>>m>>n>>x>>y;
	int sum=m*n;
	//count用于判断当前是从下往上走还是从上往下走 
	int count=1;
	int num=1;
	while(num<=sum){
		if(count%2==0){
			for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				if(i+j==count+1){
					a[i][j]=num++;
				}
			}
		}	
		}else{
			for(int i=m;i>=1;i--){
			for(int j=n;j>=1;j--){
				if(i+j==count+1){
					a[i][j]=num++;
				}
			}
		}
		}
		count++;
	}
	/*for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}*/
	cout<<a[x][y]<<endl;
	return 0;
}

上面的两段代码关键在于i,j后面赋的值必须对才行,一个是限定区域,一个没有限定区域,其实吧,蓝桥杯这个题往往是我们做这个改编题时容易犯的错

有问题可以留言交流٩(๑❛ᴗ❛๑)۶

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞烟火~

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值