逆時針蛇形排列矩陣

題目描述
  有一個NN的矩陣,這個矩陣中的元素是按逆時針方向排列的,例如我們輸入一個數4,那麼這個矩陣的元素將會是如下形式的:
  1 12 11 10
  2 13 16 9
  3 14 15 8
  4 5 6 7
  現在問題是這樣的,給你一個數N,表示這個矩陣的規模,讓你按照以上形式輸入這個矩陣。每個元素中間有一個空格。
輸入
  每行給定整數N (N<100),表示矩陣爲 N
N。
輸出
  按照描述打印對應的矩陣。
樣例輸入
  4
樣例輸出
  1 12 11 10
  2 13 16 9
  3 14 15 8
  4 5 6 7


![此圖爲N爲4的情況](https://img-blog.csdn.net/20170605230210503?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl0dGxlbm9vYg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
  此題的思路在於把創建的整個二維數組全都賦值爲0,即認爲所有爲0的位置都是可以賦值的,這是關鍵,目的是爲了判斷是否應該轉彎。
  基本思路是由題可知,可以認爲是在逆時針行走,規定一個行走的順序爲下→右→上→左。如果當前的位置的值是0時,給當前位置賦值並繼續按原來的方向行走。如果沒有出界就繼續按當前的方向行走,如果出界,則回退一步,然後根據逆時針的方向行走。
  剛開始在①和②的最外圍行走時,可以通過給定的整數N來判斷是否走出界,然後轉到③和④時,通過當前位置的座標的行索引或列索引是否是大於0來判斷是否走出界。在走完最外圍之後,就可以通過根據當前所在位置的值是否是0來決定是否應該賦值。如果是0,給當前位置賦值並繼續按原方向行走,如果不是0,即之前已經賦過值了,則證明已經走出了應該走的範圍,這時候回退一格,然後根據逆時針的方向更換方向繼續行走,走的總步數爲N*N。
  此外,如果要求的是M*N的矩陣,只需要稍許修改一下代碼即可。同時如果要求的是順時針行走,僅需改動while循環中行走的方向即可。

附上代碼:

#include <stdio.h>
int main()
{
    int n,i,j,count = 1,sum;
    scanf("%d",&n);
    sum = n * n;
    int a[n][n];
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            a[i][j]=0;
        }
    }
    i = j = 0;
    while(sum)
    {
        while(a[i][j] == 0 && i < n)
        {
            a[i][j] = count;
            count++;
            i++;
            sum--;
        }
        --i;
        ++j;
        while(a[i][j] == 0 && j < n)
        {
            a[i][j] = count;
            count++;
            j++;
            sum--;
        }
        --j;
        --i;
        while(a[i][j] == 0 && i >= 0)
        {
            a[i][j] = count;
            count++;
            i--;
            sum--;
        }
        ++i;
        --j;
        while(a[i][j] == 0 && j >= 0)
        {
            a[i][j] = count;
            count++;
            j--;
            sum--;
        }
        ++j;
        ++i;
    }
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章