前回に書いた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に通してみてから...
Macのターミナルでも実行しておきました。
はい、大丈夫みたいです。
あと久しぶりに、GitHubにもアップロードしておきました。
github.com
で、今朝は『フォートナイト』のファイナルイベント「オペレーション: スカイファイア」に参加するために、そのためだけに午前5時の30分前に起きました。
こんなに早起きしたのは、初めてです。
ちなみに、このコードのプレゼンと提出で親の許可をもらいましたー。
これで、チャプター2のシーズン7も終わり...かなー。
あっ、始まっちゃう。