emacsの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;
}