欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

NOI1.8.21二维数组右上左下遍历 题解(C++)

程序员文章站 2024-03-15 08:26:29
...

NOI1.8.21二维数组右上左下遍历 题解(C++)

哈哈,又来看题解了?

NOI1.8.21二维数组右上左下遍历 题解(C++)
画面有点模糊,不要在意…

今天的这一道题跟遍历二维数组有关系,其实这道题并不那么的难,只不过有考眼力的成分存在,像作者这种眼镜一摘世界就有两个的人,看了好久都看不出来,不说了,请听题:

21:二维数组右上左下遍历

总时间限制: 1000ms 内存限制: 65536kB
描述

给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。

NOI1.8.21二维数组右上左下遍历 题解(C++)

输入

输入的第一行上有两个整数,依次为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,此题的讲解到此结束。

相关标签: 信息学 题解