2012年7月6日金曜日

AOJ Volume0 0078: Magic Square

  1. 中央のマス目のちょうど一つ下のマス目に1をいれる。
  2. 次の数字を右斜め下のマス目にいれる。
    ただし、数字をいれようとしたマス目が正方形からはみ出している場合、すでに数字が埋まっている場合は以下の方法に従って数字を入れるマス目を探す。
    • 右にはみ出した場合には、同じ行の左はしに、左にはみ出した場合には、同じ行の右はしに、下にはみ出した場合には、同じ列の一番上に数字をいれる。
    • 数字をいれようとしたマス目が埋まっているときには、その埋まっているマス目の左斜め下のマス目にいれる。
  3. 全てのマス目が埋まるまで2を繰り返す。 


/*********************************
*   2012/07/04                   *
*   AOJ Volume0 0078             *
*   Magic Square                 *
*   crane                        *
**********************************/
//左上を(1,1) 右下を(n,n)と考える。


#include<iostream>
#include<cstdio>
using namespace std;

#define MAX_N 15+1
#define INF 500

int field[MAX_N][MAX_N];

int main(){
    int n;
    while(cin >> n, n){
       
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
                field[i][j] = INF;

        //centerの下
        int x = (n/2) + 1;
        int y = x+1;

        for(int i=1; i<=n*n; i++){//すべて埋まるまで
            bool frag = true;
            while(frag){
                if( n < y)    y = 1;//下にはみ出し
                if( n < x)  x = 1;//右にはみ出し
                if( x < 1)  x = n;//左にはみ出し

                if(field[y][x] == INF){
                    field[y][x] = i;
                    x++; y++;
                    frag = false;
                }else if(field[y][x] != INF){//もう値が入っていたら
                    x--;
                    y++;                   
                }
            }
        }

        for(int i=1; i<=n; i++){
            for(int j=1; j<=n; j++){
                printf("%4d", field[i][j]);   
            }
            cout << endl;
        }
    }
}

0 件のコメント:

コメントを投稿