發新話題

[教學]數字螺旋圖

[教學]數字螺旋圖

問 :   請寫一個程式輸入方陣的大小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 編輯 ]

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。