枚举之三

//sicily 1048. Inverso

//由于方格翻转两次就相当没有翻转,所以翻转的次数只可能取0,1,要么没翻,要么翻1次,
//这样初始状态为"wwwwwwwww",我们可以计算出每种翻转可能组合的结果,比如翻转 2459 后变成 bbwbwbwbw,那我们可以标记 bbwbwbwbw 的答案为 2459
//对于sample中的 bbwbwbwbw ,可以直接输出 2459 .因为 wwwwwwwww 经翻转 2459 后变成 bbwbwbwbw,那么 bbwbwbwbw 再经翻转 2459 后就变成 wwwwwwwww (翻转两次相当于没翻)

#include
<iostream> //数据量小,直接枚举
#include<cmath>
#include
<cstring>
#include
<vector>
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
<int> 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<mov_len[i];++j)
state[mov[i][j]]
=1-state[mov[i][j]];
}
int id=to_num();
for(int i=1;i<=9;++i)
if(ans[i]==1)
res[id].push_back(i);
}
int cases;
char ch[10];
cin
>>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<res[id].size();++i)
cout
<<res[id][i];
cout
<<endl;
}
return 0;
}

  

posted on 2011-08-23 17:03  sysu_mjc  阅读(161)  评论(0编辑  收藏  举报

导航