身为一枚标准蒟蒻,在经过近一个半月的训练,我的做题历程已经从“helloworld”到今天的回型遍历。马上我就要开始做函数题目啦!所以这道题作为一个从二维数组到函数的衔接,就会涉及这两个知识点。
给定一个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)
“void”就是“空的”的意思。也就是说这个函数不需要返回值。我们设有返回值的函数是因为我们需要这个函数的结果,而设没有返回值的函数则是因为我们需要的是这个函数的操作。
进入回型遍历函数后,计数器首先增加,填写数组将该位置赋值为1(代表这个位置已经被输出过)
然后输出这个位置上的数字
如果计数器=总数(行数*列数)就会结束函数(回型遍历操作)(之所以先输出数字再结束,是因为怕没来得及输出sum=h*l时的ss[x][y],函数就先结束了╮(╯﹏╰)╭)
(可见顺序问题还是很重要的!)
先说明了转向的条件:如果该行、下一列的位置有填写且当前列数达到总列数,则进入下一个方向的回型遍历。
hxbl(x+1,y,2)就是在告诉这个函数“你的自变量要变了!”然后hxbl收到这个指令后,形参x变成x+1,形参y变成y,形参d变成2。(行向下推一行,列不变,保持当前最后一列的状态,方向变成第二个方向)
方向1我已经写得够详细了所以接下来不再赘述(写这么详细主要是为了我这个蒟蒻能看懂,嗯(・ω・`ll))
注意最后会重新回到方向1
循环往复直到sum=总数
#include
#include
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<=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\"