//sicily 1048. Inverso //由于方格翻转两次就相当没有翻转,所以翻转的次数只可能取0,1,要么没翻,要么翻1次, //这样初始状态为"wwwwwwwww",我们可以计算出每种翻转可能组合的结果,比如翻转 2459 后变成 bbwbwbwbw,那我们可以标记 bbwbwbwbw 的答案为 2459 //对于sample中的 bbwbwbwbw ,可以直接输出 2459 .因为 wwwwwwwww 经翻转 2459 后变成 bbwbwbwbw,那么 bbwbwbwbw 再经翻转 2459 后就变成 wwwwwwwww (翻转两次相当于没翻) #include//数据量小,直接枚举 #include #include #include using namespace std; int mov[10][10]={ {},{ 1,2,4,5},{ 1,2,3,4,5,6},{ 2,3,5,6},{ 1,2,4,5,7,8},{ 1,2,3,4,5,6,7,8,9},{ 2,3,5,6,8,9},{ 4,5,7,8},{ 4,5,6,7,8,9},{ 5,6,8,9}}; int mov_len[10]={ 0,4,6,4,6,9,6,4,6,4}; int state[10]; int to_num() //对state离散化 { int s=0; for(int i=1;i<=9;++i) s+=pow(2.0,double(i-1))*state[i]; return s; } vector res[1000]; int main() { int ans[10]; for(ans[1]=0;ans[1]<=1;++ans[1]) for(ans[2]=0;ans[2]<=1;++ans[2]) for(ans[3]=0;ans[3]<=1;++ans[3]) for(ans[4]=0;ans[4]<=1;++ans[4]) for(ans[5]=0;ans[5]<=1;++ans[5]) for(ans[6]=0;ans[6]<=1;++ans[6]) for(ans[7]=0;ans[7]<=1;++ans[7]) for(ans[8]=0;ans[8]<=1;++ans[8]) for(ans[9]=0;ans[9]<=1;++ans[9]) { memset(state,0,sizeof(state)); for(int i=1;i<=9;++i) if(ans[i]==1) { for(int j=0;j >cases; while(cases--) { cin>>ch; if(strcmp(ch,"wwwwwwwww")==0) //注意输入为"wwwwwwwww"的情况 { cout<<"11\n"; continue; } for(int i=0;i<9;++i) state[i+1]=(ch[i]=='w'?0:1); int id=to_num(); for(int i=0;i