【技巧题】贪心 2017大数据研究中心夏令营上机考试 D:特殊密码锁

原题:点击打开链接

假如想提交代码可以用这个:点击打开链接

题目大意:按一个按钮时,跟它相邻的两个按钮状态也会反转。如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。问两个按钮序列的最少按多少个

思路:贪心算法,每种按钮只会按或不按,二者肯定只有一种满足要求,确定了之后讨论下一个按钮(其实只要一个循环就可以,一开始以为是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:看其他博主的代码又短小又精辟,长叹息以掩涕息自己还是太菜。。。。


猜你喜欢

转载自blog.csdn.net/always_ease/article/details/80539455