http://cxsjsxmooc.openjudge.cn/2018t2fallsum/001/
提示:找出枚举类题目的局部是什么,以小见大求全部,从而避免枚举大量情况
观察:前i个可以推出第i+1个的情况
启示:关注问题本身的解决方案和实现过程,并非案例给的情形拼凑,以及位运算很省空间
#include<memory>
#include<string>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
char a[40],b[40];
int now=0,change=0,goal=0;
int len;
int ans=40,sumnow=0;
int GetBit(int num, int i)
{
return (num >> i) & 1;
}
int SetBit(int i, int v)
{
int sum=0;
if(v) sum |= (1 << (i));
else sum &= ~(1 << (i));
return sum;
}
void FlipBit(int &change, int i)
{
change ^= (1 << i);
}
void ClickBit(int &change, int i)
{
if(i>=0&&i<=len-1)
{
sumnow++;
if(i==0)
{
FlipBit(change, i);
FlipBit(change, i+1);
// printf("改变1:i=%d,i+1=%d\n",i,i+1);
}
else if(i==len-1)
{
FlipBit(change, i);
FlipBit(change, i-1);
// printf("改变2:i=%d,i-1=%d\n",i,i-1);
}
else
{
FlipBit(change, i);
FlipBit(change, i-1);
FlipBit(change, i+1);
// printf("改变3:i-1=%d,i=%d,i+1=%d\n",i-1,i,i+1);
}
}
}
/*bool CmpBit(int &change, int &goal, int i)
{
printf("此时的第%d位change=%d,goal=%d\n",i,change,goal);
if(GetBit(change,i) == GetBit(goal,i)) return 1;
else return 0;
}*/
void Ans(int v)
{
sumnow = 0;
change = now;
//printf("开始:change=%d\n",change);
if(v)
{
ClickBit(change, 0);
}
for(int j=0;j<len;++j)
{
//printf("v=%d:j=%d,change=%d,goal=%d,sumnow=%d\n",v,j,change,goal,sumnow);//
//printf("change第%d位=%d,goal第%d位=%d\n",j,GetBit(change,j),j,GetBit(goal,j));
if(GetBit(change,j) == GetBit(goal,j))
{
if(change == goal)
{
if(sumnow < ans) {ans = sumnow;}// printf("按下:j=%d,ans=%d\n",j,ans);
else break;
}
continue;
}
else
{
if(j!=len-1)ClickBit(change,j+1);
//printf("change=%d\n",change);
continue;
}
}
}
int main()
{
int i,j;
gets(a);
gets(b);
len = strlen(a);
//printf("a=%s,b=%s,goal=%d\n",a,b,goal);
for(i=0;i<len;++i)
{
if(a[i]=='0') now += SetBit(i,0);
if(a[i]=='1') now += SetBit(i,1);
if(b[i]=='0') goal += SetBit(i,0);
if(b[i]=='1') goal += SetBit(i,1);
//printf("i=%d,a[%d]=%c,now=%d,b[%d]=%c,goal=%d\n",i,i,a[i],now,i,b[i],goal);//
}
//printf("now=%d,goal=%d\n",now,goal);//
//第0个开关按下
Ans(1);
//第0个开关不按
Ans(0);
//没答案
if(ans == 40) printf("impossible");
else printf("%d",ans);
return 0;
}