标签:&& arr 遍历 字形 int 纵坐标 扫描 行号 CCFZ
题目
思想
规律
首先通过画图我们可以看出一些规律
- 每一对角线行(下面简称行)上的点的横纵坐标之和为定值,就比如(1,1)所在的行的 行号
i
为2(此处用横纵坐标之和作为行号),当我们知道一个点的横坐标j
的时候的时候就可以求出纵坐标i-j
. - 通过对行号的观察可以发现当行号为偶数的时候都是从向右上去遍历,当行号为奇数的时候都是向左下去遍历
思想
为了将规则进行简化并且统一,我们将遍历的范围进行扩大
在扩大之后遍历规则就变为了
- 行号为偶数时向右上遍历,此时纵坐标j可以从1开始向右上去遍历,此时的横坐标为 i-j。比如在遍历行号为
i=4
的行时,j=1
即从(3,1)点开始向左上遍历遍历到j<i
(因为坐标是从1开始的,所以单一坐标都不可以超过i) - 行号为偶数时向左下遍历,此时纵坐标j可以从
j=i-1
开始向左下去遍历,此时的横坐标为 i-j,遍历终止条件为j==0
时停止。
代码
#include<iostream>
#include<stdio.h>
using namespace std;
const int N=510;
int arr[N][N];
int n;
int main(){
cin>>n;
//输入
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%d",&arr[i][j]);
}
}
//遍历
for(int i=2;i<=2*n;i++){
//当坐标之和为偶数时,应该从下往上扫描
if(i%2){
for(int j=1;j<i;j++){
if(j>=1&&j<=n && i-j>=1&&i-j<=n){
printf("%d ",arr[j][i-j]);
}
}
}
//当坐标之和为奇数时,应该从上往下扫描
else{
for(int j=i-1;j>0;j--){
if(j>=1&&j<=n && i-j>=1&&i-j<=n){
printf("%d ",arr[j][i-j]);
}
}
}
}
return 0;
}
后记
此题思路我是从y总的视频中学会的,如果还没懂的同学,建议直接看y总视频视频出处。y总YYDS。
标签:&&,arr,遍历,字形,int,纵坐标,扫描,行号,CCFZ 来源: https://blog.csdn.net/heiana/article/details/123175111
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。