逆向输出回环数组

@date:2017-07-19 22:34:00

题目来源:http://noi.openjudge.cn/ch0108/23/

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

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

样例输入

1	2	3	4
5	6	7	8
9	10	11	12

样例输出

1
5
9
10
11
12
8
4
3
2
6
7

PHP实现 #

$a = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12]
];

$row = count($a);
$col = count($a[0]);

$i=0;$j=0;
$count = $row * $col;
while ($count > 0){

    //打印最左边一列
    for($k=1;$k<$row; $k++){
        $count--;echo $a[$i][$j] .PHP_EOL;$i++;
    }

    //打印最下边一行
    for($k=1;$k<$col; $k++){
        $count--;echo $a[$i][$j].PHP_EOL;$j++;
    }

    //打印最右边一列
    for($k=1;$k<$row; $k++){
        $count--;echo $a[$i][$j].PHP_EOL;$i--;
    }

    //打印最上边一行
    for($k=1;$k<$col; $k++){
        $count--;echo $a[$i][$j].PHP_EOL;$j--;
    }

    $row-=2;//走完一圈,行数减2
    $col-=2;//走完一圈,列数减2
    $i++;//最外一圈不用再次输出
    $j++;//最外一圈不用再次输出

    if($row == 1){
        for($k=0;$k<$col; $k++){
            $count--;echo $a[$i][$j].PHP_EOL;$j++;
        }
    }elseif($col == 1){
        for($k=0;$k<$row; $k++){
            $count--;echo $a[$i][$j].PHP_EOL;$i++;
        }
    }
}

可以调整代码实现原题目里的示例顺序输出。

C语言实现 #


#include <stdio.h>
#define maxN 101
int main(int argc, char *argv[])
{
    int row,col,i,j,k;
    int a[maxN][maxN];
    int count;
    
    printf("请输入行数 列数:\n"); 
    scanf("%d%d",&row,&col);
    printf("请输入%d*%d矩阵:\n", row, col);
	 
    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    
    if(row==1)//只有一行
    {
        i=0;j=0; 
        for(k=1;k<=col;k++)
        { printf("%d\n",a[i][j]);j++;}
    }
    else if(col==1)//只有一列
    {
        i=0;j=0;
        for(k=1;k<=row;k++)
        { printf("%d\n",a[i][j]);i++;}
    }
    else
    {
        i=0;j=0;
        count=row*col;
        while(count>0)
        {   
            for(k=1;k<row;k++)
            { count--; printf("%d\n",a[i][j]);i++;}  //输出一个环的左侧那一条边
            
            for(k=1;k<col;k++)
            { count--; printf("%d\n",a[i][j]);j++;}  //输出一个环的下面那一条边
            
            for(k=1;k<row;k++)
            { count--; printf("%d\n",a[i][j]);i--;}  //输出一个环的右侧那一条边
            
            for(k=1;k<col;k++)
            { count--; printf("%d\n",a[i][j]);j--;}  //输出一个环的上面那一条边 
            
            i++;
            j++;
            row-=2;
            col-=2;
            if(row==1)//只剩下一行
            {
                for(k=1;k<=col;k++)
                { count--; printf("%d\n",a[i][j]);j++;}
            }
            else if(col==1)//只剩下一列
            {
                for(k=1;k<=row;k++)
                { count--; printf("%d\n",a[i][j]);i++;}
            }
        }
    }
    return 0;
}

参考:
http://www.cnblogs.com/huashanqingzhu/p/5666473.html

Build by Loppo 0.6.14