原题:点击打开链接
假如想提交代码可以用这个:点击打开链接
题目大意:按一个按钮时,跟它相邻的两个按钮状态也会反转。如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。问两个按钮序列的最少按多少个
思路:贪心算法,每种按钮只会按或不按,二者肯定只有一种满足要求,确定了之后讨论下一个按钮(其实只要一个循环就可以,一开始以为是dfs就搭了个递归的框架。。。)
做题碰到了一些问题:
1、需要修改字符的不能使用string类型,要用char数组
2、strlen(sch);//求字符串长度
3、memcpy(char* tar,char * src,int n);//从src拷贝n个字符到tar中;使用之前要先memset
4、使用memcpy时注意数组下标!!
#include<iostream> #include<string.h> #include<string> using namespace std; char tar[35],s[35]; int ans=100,len; void changebit(int c) { if (c-1>=0) s[c-1]='1'-(s[c-1]-'0'); if (c+1<len) s[c+1]='1'-(s[c+1]-'0'); s[c]='1'-(s[c]-'0');//居然忘了。。。 } bool dfs(char * src,int c,int count)//讨论第c个按钮 { bool flag=false; char t1[31],t2[31]; if (c-2>=0) { memset(t1,0,sizeof(t1));memset(t2,0,sizeof(t2)); memcpy(t1,s,c-1);//注意这边是-1不是-2!!!注意数组下标 memcpy(t2,tar,c-1); } else { memset(t1,0,sizeof(t1));memset(t2,0,sizeof(t2)); } if (strcmp(t1,t2)!=0 )//之前的不相等则返回 return false; if (strcmp(s,tar)==0)//满足条件 { ans=min(ans,count); return true; } else if ( tar[len-2]!=s[len-2] && tar[len-1]!=s[len-1] ) { ans=min(ans,count+1); return true; } else if (c>=len) return false; if (dfs(s,c+1,count))//不按按钮 flag=true; else { changebit(c); if (dfs(s,c+1,count+1))//按按钮 flag=true; changebit(c); } return flag; } int main() { cin>>s;cin>>tar; len=strlen(s);//求字符串长度 if (len==1 && s[0]==tar[0]) cout<<0<<endl; else if (len==1 && s[0]!=tar[0]) cout<<1<<endl; else if (!dfs(s,0,0)) cout<<"impossible"<<endl; else cout<<ans<<endl; return 0; }ps:看其他博主的代码又短小又精辟,长叹息以掩涕息自己还是太菜。。。。