NOI1.8.21二维数组右上左下遍历 题解(C++)
NOI1.8.21二维数组右上左下遍历 题解(C++)
哈哈,又来看题解了?
画面有点模糊,不要在意…
今天的这一道题跟遍历二维数组有关系,其实这道题并不那么的难,只不过有考眼力的成分存在,像作者这种眼镜一摘世界就有两个的人,看了好久都看不出来,不说了,请听题:
21:二维数组右上左下遍历
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。
输入
输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100)
输出
按遍历顺序输出每个整数。每个整数占一行。
样例输入
3 4
1 2 4 7
3 5 8 10
6 9 11 12
样例输出
1 2 3 4 5 6 7 8 9 10 11 12//所有空格都是回车,作者想节省点空间
呃…首先呢你不要被那张图给吓到了,不要慌,仔细一看,你就会发现其实就是对角线遍历过去,每次预判一下,然后x+1,y-1直到预判结果为false为止,记住一句话:只要整不死,就往死里整。呃,通常的习惯是先预判,输出当前数,坐标移动。仔细观察你会发现,上面的解释图中不仅有ROW=0的,还有COL-1那一列的所有点都要以它为起点向左下方画对角线哦,还有数组的第0行,最后一列不能重复算两遍哦*????
别说了,伪代码走起:
#include<bits/stdc++.h>//万能头文件
using namespace std;
int main(){
int x,y;//就是row and col了
int a[105][105];
cin>>x>>y;
for(int i = 0;i<x;i++){
for(int j = 0;j<y;j++){
cin>>a[i][j];
}
}//输入应该不用说了吧
for(/*第0行的所有元素遍历一遍*/){
int x1 = 0;
int y1 = i;
while(/*预判是否超出边界*/){
//输出当前坐标所指的数
x1++;
y1--;//移动坐标
}
}
for(int j = 1/*为什么是1上面有说*/;j<x;j++){
int x1 = j;
int y1 = y-1;
while(/*再次预判是否超出边界*/){
//输出当前坐标所指的数
//再次移动坐标
}
}
}
总体来说代码不长,是吧?自己可以先想想如何把注释转代码吧,加油吧,少年!想好了再向下看吧
--------------------------------------------(一道普通的分界线)-----------------------------------------------
代码想出来了吗?如果想出来了,那么恭喜你,没想出来也不用丧,毕竟下面有完整代码嘛~
现在请出我们的完整代码,当当当当:
#include<bits/stdc++.h>
using namespace std;
int main(){
int x,y;
int a[105][105];
cin>>x>>y;
for(int i = 0;i<x;i++){
for(int j = 0;j<y;j++){
cin>>a[i][j];
}
}
for(int i = 0;i<y;i++){
int x1 = 0;
int y1 = i;
while(x1<x&&y1>=0&&y1<y){
cout<<a[x1][y1]<<endl;
x1++;
y1--;
}
}
for(int j = 1;j<x;j++){
int x1 = j;
int y1 = y-1;
while(x1<x&&y1>=0&&y1<y){
cout<<a[x1][y1]<<endl;
x1++;
y1--;
}
}
return 0;
}
OK,此题的讲解到此结束。
上一篇: 当所有pos刷卡机关闭自选商户后的那些事,请牢记第10条
下一篇: VUE 组件之间通信