5x5
emacsemacsのautoloadのヘルプ を見てたら、5x5みたいな普段使わない関数はデフォルトでautoloadに設定されているよ、というようなことが書いてあり。 5x5て何する関数なの?と思って実行してみたら、ゲームだった。
ルール
- 5x5のマス目があり、各マスはon/offのどちらかの状態を取る
- 目標は、全てのマスをonにすること
- 任意のマスを押すと、上下左右と自分の最大5個のマスが反転する
- 端のマスを押した場合、はみ出る部分は無視される
しばらく遊んだけど思ったより難しいのでプログラムで解いた。
#include <vector>
#include <iostream>
using namespace std;
void check(int n){
vector<vector<int> > x(5, vector<int>(5, 0));
vector<vector<bool> > y(5, vector<bool>(5, false));
for(int i = 0; i < 5; i++){
if(n & 1<<i){
x[0][i] = 1;
if(i > 0) y[0][i-1] = !y[0][i-1];
y[0][i] = !y[0][i];
y[1][i] = !y[1][i];
if(i < 4) y[0][i+1] = !y[0][i+1];
}
}
for(int i = 1; i < 5; i++){
for(int j = 0; j < 5; j++){
if(!y[i-1][j]){
x[i][j] = 1;
if(j > 0) y[i][j-1] = !y[i][j-1];
y[i][j] = !y[i][j];
if(j < 4) y[i][j+1] = !y[i][j+1];
y[i-1][j] = !y[i-1][j];
if(i < 4) y[i+1][j] = !y[i+1][j];
}
}
}
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
if(!y[i][j]) return;
}
}
cout << "===" << endl;
for(int i = 0; i < 5; i++){
for(int j = 0; j < 5; j++){
cout << x[i][j];
}
cout << endl;
}
}
int main(){
for(int i = 0; i < 1<<5; i++){
check(i);
}
return 0;
}