【c++二维数组回形遍历】蒟蒻的题解日记1

适合阅读人群:

身为一枚标准蒟蒻,在经过近一个半月的训练,我的做题历程已经从“helloworld”到今天的回型遍历。马上我就要开始做函数题目啦!所以这道题作为一个从二维数组到函数的衔接,就会涉及这两个知识点。

问题 T: 二维数组回形遍历

时间限制: 1 Sec  内存限制: 128 MB

题目描述

给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组。如图所示:

输入

输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100)

输出

按遍历顺序输出每个整数。每个整数占一行。

样例输入

4 4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

样例输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

要考虑到的问题:

    1.什么时候转向,转向的条件?

    2.什么时候结束程序,不让它继续执行

    3.是否用两个数组?循环还是函数?(一开始我用的是循环,结果还是难逃函数命运QAQ)

这是我设的全局变量,tx(填写)用来解决问题1,sum(计数器)用来解决问题2,h,l是题目要求的行和列,ss(输入)是我常用的变量名嘿嘿嘿(~ ̄▽ ̄)~ (别问我为什么输入是ss不是sr)
全局变量不用赋初值,默认为0,很方便,但会比较占内存

主函数——输入完已知条件后执行hxbl(回型遍历)函数,三个初始值都是1

现在来看看函数的威力ヽ(`Д´)ノ

这个void函数的自变量是行坐标x,列坐标y和方向d。

“void”就是“空的”的意思。也就是说这个函数不需要返回值。我们设有返回值的函数是因为我们需要这个函数的结果,而设没有返回值的函数则是因为我们需要的是这个函数的操作

进入回型遍历函数后,计数器首先增加,填写数组将该位置赋值为1(代表这个位置已经被输出过)

然后输出这个位置上的数字

如果计数器=总数(行数*列数)就会结束函数(回型遍历操作)(之所以先输出数字再结束,是因为怕没来得及输出sum=h*l时的ss[x][y],函数就先结束了╮(╯﹏╰)╭)

(可见顺序问题还是很重要的!)

方向1



先说明了转向的条件:如果该行、下一列的位置有填写且当前列数达到总列数,则进入下一个方向的回型遍历。

hxbl(x+1,y,2)就是在告诉这个函数“你的自变量要变了!”然后hxbl收到这个指令后,形参x变成x+1,形参y变成y,形参d变成2。(行向下推一行,列不变,保持当前最后一列的状态,方向变成第二个方向)

方向2

方向1我已经写得够详细了所以接下来不再赘述(写这么详细主要是为了我这个蒟蒻能看懂,嗯(・ω・`ll))

方向3

方向4

注意最后会重新回到方向1

循环往复直到sum=总数

#include<iostream>
#include<cstring>
using namespace std;
int sum,tx[101][101],h,l;
int ss[1001][1001];
void hxbl(int x,int y,int d/*方向*/)
{
	sum++;
	tx[x][y]=1;/*填写*/
	cout<<ss[x][y]<<endl;
	if(sum==h*l)
	{
		return;/*结束操作*/
	}
	if(d==1)
	{
		if(tx[x][y+1]==1||y>=l){hxbl(x+1,y,2);}
		else {hxbl(x,y+1,1);}
	}
	if(d==2)
	{
		if(tx[x+1][y]==1||x>=h){hxbl(x,y-1,3);}
		else {hxbl(x+1,y,2);}
	}
	if(d==3)
	{
		if(tx[x][y-1]==1||y<=1){hxbl(x-1,y,4);}
		else {hxbl(x,y-1,3);}
	}
	if(d==4)
	{
		if(tx[x-1][y]==1||x<=1){hxbl(x,y+1,1);}
		else {hxbl(x-1,y,4);}
	}
}
int main()
{
	cin>>h>>l;
	for(int i=1; i<=h; i++)	for(int j=1; j<=l; j++)	cin>>ss[i][j];
	hxbl(1,1,1);
	return 0;
}
打了这么多,累T_T\"

猜你喜欢

转载自blog.csdn.net/JaneSilver/article/details/81005806