AOJ0131
問題:Doctor's Strange Particles
ライツアウトの解を求める。1個しか解がないと言う甘え仕様。
上から順番に処理していく。
まず1行目について全パターンの押し方を試す。
i行目はi-1行目を全て消さないと行けないので、押し方は一意に定まる。
そして一番下の行が全て消えていたらOK。
bitset便利。
#include<iostream> #include<vector> #include<bitset> #include<algorithm> using namespace std; void flip(vector<bitset<10> >& field, int y, int pos) { field[y].flip(pos); if(pos+1<10)field[y].flip(pos+1); if(pos-1>=0)field[y].flip(pos-1); if(y+1<10)field[y+1].flip(pos); if(y-1>=0)field[y-1].flip(pos); } int main() { int _; cin >> _; while(_--) { vector<bitset<10> > f(10,0); for(int i=0;i<10;++i) { int a; for(int j=0;j<10;++j) { cin >> a; if(a) f[i].flip(9-j); } } for(int v=0; v<(1<<10); ++v) { vector<pair<int,int> > ans; vector<bitset<10> > field = f; for(int i=0;i<10; ++i) { if(v&(1<<i)) { flip(field,0,i); ans.push_back(make_pair(0,i)); } } for(int j=1; j<10; ++j) { for(int k=0; k<10; ++k) { if(field[j-1][k]) { flip(field,j,k); ans.push_back(make_pair(j,k)); } } } bool clear = !field[9].any(); if(clear) { sort(ans.begin(),ans.end()); for(int i=0; i<10; ++i) { for(int j=0; j<10; ++j) { cout << binary_search(ans.begin(),ans.end(),make_pair(i,9-j)); if(j!=9)cout << " "; } cout << endl; } } } } return 0; }