題目描述
有一個NN的矩陣,這個矩陣中的元素是按逆時針方向排列的,例如我們輸入一個數4,那麼這個矩陣的元素將會是如下形式的:
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
現在問題是這樣的,給你一個數N,表示這個矩陣的規模,讓你按照以上形式輸入這個矩陣。每個元素中間有一個空格。
輸入
每行給定整數N (N<100),表示矩陣爲 NN。
輸出
按照描述打印對應的矩陣。
樣例輸入
4
樣例輸出
1 12 11 10
2 13 16 9
3 14 15 8
4 5 6 7
基本思路是由題可知,可以認爲是在逆時針行走,規定一個行走的順序爲下→右→上→左。如果當前的位置的值是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;
}