問 : 請寫一個程式輸入方陣的大小n,印出n*n的數字螺旋圖,例如以下為n=5:
1 2 3 4 5
6 7 8 9 6
5 4 5 0 7
4 3 2 1 8
3 2 1 0 9
答 : 以下是用VC++寫的Code
參考一下吧
複製內容到剪貼板
代碼:
void main()
{
int* p = NULL;
int n = 0;
// 輸入n的值
printf("\n輸入n值:");
scanf("%d", &n);
// 向系統取得n * n大小的int空間(n * n的陣列)
p = new int[n * n];
// 若成功向系統取得空間
if(p != NULL)
{
int nCount = 0;
int nNext = 0;
int x = 0;
int y = 0;
int nNumber = 1;
// 設定方向( 0==>右 ; 1==>下 ; 2==>左 ; 3==>上 )
int nDirection = 0;
// 先將取得的空間,作初使化(全設為-1)
memset(p, -1, sizeof(int)*(n * n));
// 設定n*n的數字螺旋圖
// 因為是 n * n的陣列,故設定完n * n次後,即離開迴圈
while(nCount < n * n)
{
nCount++;
// 設定n*n的數字螺旋圖
*(p + x + (y*n)) = nNumber;
// 設定下一個要設定的位置
// 若是向右移
if(nDirection == 0)
{
x++;
// 若是下一個位置超出陣列的範圍(x+1 == n)
// 或是下一個位置已經被設定過(*(p + (x+1) + (y*n)) != -1)
// 則換下一個方向
if( (x+1 == n) || (*(p + (x+1) + (y*n)) != -1))
{
nDirection++;
}
}
else if(nDirection == 1)
{
// 若是向下移
y++;
// 若是下一個位置超出陣列的範圍(y+1 == n)
// 或是下一個位置已經被設定過(*(p + x + ( (y+1) *n)) != -1)
// 則換下一個方向
if( (y+1 == n) || (*(p + x + ( (y+1) *n)) != -1))
{
nDirection++;
}
}
else if(nDirection == 2)
{
// 若是向左移
x--;
// 若是下一個位置超出陣列的範圍(x-1 == -1)
// 或是下一個位置已經被設定過(*(p + (x-1) + (y*n)) != -1)
// 則換下一個方向
if( (x-1 == -1) || (*(p + (x-1) + (y*n)) != -1))
{
nDirection++;
}
}
else if(nDirection == 3)
{
// 若是向上移
y--;
// 若是下一個位置超出陣列的範圍(y-1 == -1)
// 或是下一個位置已經被設定過(*(p + x + ( (y-1) *n)) != -1)
// 則換下一個方向
if( (y-1 == -1) || (*(p + x + ( (y-1) *n)) != -1))
{
nDirection = 0;
}
}
// 設定的數值+1
nNumber++;
// Y設定的數值大於10
// 則重新設為0
if(nNumber >= 10)
{
nNumber = 0;
}
}
printf("\n");
// 列印出陣列的值
for(int i=0 ; i<n ; i++)
{
for(int j=0 ; j<n ;j++)
{
printf("%d ", *(p + j + (i*n)));
}
printf("\n");
}
// 釋放向系統取得的空間
{
delete[] p;
p = NULL;
}
}
system("pause");
}
[
本帖最後由 philxyz0316 於 2006-8-27 13:05 編輯 ]