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'; }