http://acm.pku.edu.cn/JudgeOnline/problem?id=1222


Код:
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int> > board,solved;
void input();
void generate(vector<int> v,int n);
void run(vector<int>);
void print(vector<vector<int> >& v);
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cout<<"PUZZLE #"<<i+1<<'\n';
input();
generate(vector<int>(),0);
print(solved);
}
}
void input(){
board=vector<vector<int> >(5,vector<int>(6));
for(int i=0;i<board.size();i++)
for(int j=0;j<board[i].size();j++)
cin>>board[i][j];
}
void generate(vector<int> v,int n){
if(n==6){
run(v);
return;
}
generate(v,n+1);
v.push_back(n);
generate(v,n+1);
}
int xx[]={0,0,0,1,-1};
int yy[]={-1,0,1,0,0};
bool good(int x,int y,vector<vector<int> >& v){
return x>=0 && x<v.size() && y>=0 && y<v[x].size();
}
void press(int x,int y,vector<vector<int> >& v){
for(int i=0;i<5;i++)
if(good(x+xx[i],y+yy[i],v))
v[x+xx[i]][y+yy[i]]=!v[x+xx[i]][y+yy[i]];
}
void run(vector<int> v){
vector<vector<int> > b=board,s(5,vector<int>(6)),e(5,vector<int>(6,0));
for(int i=0;i<v.size();i++){
press(0,v[i],b);
s[0][v[i]]=1;
}
for(int i=0;i+1<b.size();i++)
for(int j=0;j<b[i].size();j++)
if(b[i][j]){
press(i+1,j,b);
s[i+1][j]=1;
}
if(b==e) solved=s;
}
void print(vector<int>& v);
void print(vector<vector<int> >& v){
for(int i=0;i<v.size();i++)
print(v[i]);
}
void print(vector<int>& v){
for(int i=0;i+1<v.size();i++) cout<<v[i]<<' ';
cout<<v.back()<<'\n';
}