sicily 1048. Inverso

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

#include<iostream> //数据量小,直接枚举
#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,j=1;
for(int i=1;i<=9;++i)
{
s+=j*state[i];
j*=2;
}
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-07-21 11:59  sysu_mjc  阅读(373)  评论(0编辑  收藏  举报

导航