最省納智捷1年新車83萬起6檔好股票放一年賺5成輕忽小中風,當心變殘障睽違25天終開會 立院...
2011-12-16 15:25:17 人氣(586) | 回應(0) | 推薦(0) | 收藏(0) 上一篇 | 下一篇

[UVA] 1266 - Magic Square

0
收藏
0
推薦

If you have good observations skills, you may found that building a Magic Square is simple. A Magic Square
has only an odd number N of rows and columns. For this problem you could expect the values to be
3 N 15 . A Magic Square is created by integer numbers in the range from 1 to N2 , with a peculiar
property, the ``sum of the numbers" in each row, column and diagonal is the same value.
For example the case for n = 3 is:
M. Square Rows Columns Diagonals
8 1 6 8+1+6 = 15 8+3+4 = 15 8+5+2 = 15
3 5 7 3+5+7 = 15 1+5+9 = 15 4+5+6 = 15
4 9 2 4+9+2 = 15 6+7+2 = 15
Hint: Imagine that the square is rounded. That is, the last row is connected with the first row and the last
column is connected with the first column. As shown in the examples, the starting point is the center of the
first row and observe how the numbers are placed following diagonals. There is only one more thing to
observe, what happens when you find a cell that is already in use.
Input
A file with several lines, each line has the value of n .
Output
For each input line, print N and the sum in the first line, followed by the magic square. To see a nice looking
square, take into account the maximum length in characters of N2 and print each number with the maximum
length preceded by one space or blank character. Print one line between squares.
Sample Input
3
5
Sample Output
n=3, sum=15
8 1 6
3 5 7
4 9 2
n=5, sum=65
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9






作法 : 魔方陣, 做法來自 wiki

#include<stdio.h>
#include<string.h>
int main() {
    int n, i, j;
    while(scanf("%d", &n) == 1) {
        printf("n = %d, sum = %d\n", n, n*(n*n+1)/2);
        int map[15][15], x = 0, y = n/2;
        memset(map, 0, sizeof(map));
        for(i = 1; i <= n*n; i++) {
            if(map[x][y]) {
                x += 2, y--;
                if(x >= n)    x -= n;
                if(y < 0)     y += n;
                map[x][y] = i;
            } else
                map[x][y] = i;
            x--, y++;            
            if(x < 0)    x += n;
            if(y >= n)    y -= n;
            
        }
        for(i = 0; i < n; i++, puts(""))
            for(j = 0; j < n; j++)
                printf("%3d", map[i][j]);
    }
    return 0;
}

1266Magic Square
台長:Morris
人氣(586) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: UVA |
此分類下一篇:[UVA] 1121 - Subsequence
此分類上一篇:[UVA] 1185 - Big Number

我要回應
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入以下數字 (ex:123)

(有*為必填)
詳全文