寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C++による3×3魔方陣(三方陣)の解法

前回に書いた3×3魔方陣についての話の続きです。
「もしも競技プログラミングからの出題だったら」って、考え直してみました。

で、僕の解法としては...

与えられた条件より、二重ループを利用して、各列の和が15になる組み合わせを、3×3の二次元配列に代入することで、期待する出力、つまり解答を得られる、と言うわけです。

だから、コードとして書けば、こんな感じになります。

/*
3x3 Magic Square in C++
C++による3×3魔方陣(三方陣)の解法
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int main(void){
    int ans[3][3];
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            ans[i][j]=0;
        }
    }
    ans[1][1]=5;
    for(int i=0;i<2;i++){
        for(int j=0;j<3;j++){
            if(ans[i+1][j+1]==5){
                ans[i][j]=8;
                ans[i+2][j+2]=2;
            }else if(ans[i+1][j-1]==5){
                ans[i][j]=6;
                ans[i+2][j-2]=4;
            }
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(ans[i][j]==0){
                if(j==0){
                    ans[i][j]=15-ans[i-1][j]-ans[i+1][j];
                    ans[i][j+2]=10-ans[i][j];
                }
                if(i==0){
                    ans[i][j]=15-ans[i][j-1]-ans[i][j+1];
                    ans[i+2][j]=10-ans[i][j];
                }
            }
        }
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            cout<<ans[i][j];
            cout<<((j==2) ? "\n" : " ");
        }
    }
    return 0;
}

動作の確認については、とりあえずオンライン実行環境のpaiza.IOに通してみてから...
f:id:neguse_atama:20210913044508p:plain
Macのターミナルでも実行しておきました。

f:id:neguse_atama:20210913044230p:plain
はい、大丈夫みたいです。

あと久しぶりに、GitHubにもアップロードしておきました。
github.com

で、今朝は『フォートナイト』のファイナルイベント「オペレーション: スカイファイア」に参加するために、そのためだけに午前5時の30分前に起きました。
こんなに早起きしたのは、初めてです。
ちなみに、このコードのプレゼンと提出で親の許可をもらいましたー。
これで、チャプター2のシーズン7も終わり...かなー。
あっ、始まっちゃう。