如下图所示,小明用从 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后面赋的值必须对才行,一个是限定区域,一个没有限定区域,其实吧,蓝桥杯这个题往往是我们做这个改编题时容易犯的错
有问题可以留言交流٩(๑❛ᴗ❛๑)۶