您的位置:首页 > 其它

智力游戏

2015-10-11 18:35 218 查看
【Description】
whitecloth 最近迷上了一个你小时候已经玩厌了的游戏:移火柴棒。
他现在吵着要你陪他玩,你没有办法,只好写一个程序来完成这个工
作了。
你被给出了一个火柴拼成的等式,比如说下面这个:( 5 + 7 = 7 )
它显然是不成立的,但是我们可以通过移动一个其中的火柴使得它成
立。变成如下的一个等式:( 6 + 1 = 7 )
现在给出一个类似的等式,请问最少移动多少根火柴可以使得它变成
一个成立的等式。
【Input】
三个整数,表示原等式中的两个加数以及和
【Output】
一个数,表示最小移动几根火柴能使等式成立,不允许改变位数以及
符号,不要制造0 开头的数。
【Sample Input】
5 7 7
【Sample Output】
1
【Hint】
对于100%的数据,每个数在0 到999 之间

先写出一个8,把上面的7根火柴编号,则0-9都可以用着7根火柴中的某些来拼成,那么用到了状态压缩,sta[i]用一个二进制串表示由那几根火柴拼成,所以枚举两个改变后的加数,则其和也可知道,那么原来数字能拼成新数字的前提是总共的火柴数量相同,在最优的情况下不考虑一个数的总位数改变的情况,(考虑一定对,不考虑是贪心的剪枝,正确性显然),考虑一下,如果新变成的数字的某个位置上的火柴原来数字上有就不用动,如果原来数字上某个位置的火柴新数字中没有就把它拿出来,最后拿里少补在哪里,因为总的个数相同,所以一定能补出来,综上所述,只考虑需要拿走多少个,找最小值就好。题解上说注意1有两种,一种左对齐,一种右对齐,但是我没考虑也过了,应该因为数据中没有这种情况吧。

#include<cstdio>
using namespace std;
int A,B,C;
int sta[1002];
int w[1002]={6,2,5,5,4,5,6,3,7,6};
int p[1002];
void Pre(){
sta[0]=(1<<0)+(1<<1)+(1<<2)+(1<<3)+(1<<4)+(1<<5);
sta[1]=(1<<4)+(1<<5);
sta[2]=(1<<0)+(1<<5)+(1<<6)+(1<<2)+(1<<3);
sta[3]=(1<<0)+(1<<5)+(1<<6)+(1<<4)+(1<<3);
sta[4]=(1<<1)+(1<<6)+(1<<5)+(1<<4);
sta[5]=(1<<0)+(1<<1)+(1<<6)+(1<<4)+(1<<3);
sta[6]=(1<<0)+(1<<1)+(1<<2)+(1<<3)+(1<<4)+(1<<6);
sta[7]=(1<<0)+(1<<4)+(1<<5);
sta[8]=(1<<0)+(1<<1)+(1<<2)+(1<<3)+(1<<4)+(1<<5)+(1<<6);
sta[9]=(1<<0)+(1<<1)+(1<<3)+(1<<4)+(1<<5)+(1<<6);
}
int TJ(int y,int x){
int cnt=0;
y=sta[y];
x=sta[x];
for(int i=0;i<27;i++){
if(((1<<i)&x)&&!((1<<i)&y)) cnt++;
}
return cnt;
}
int ans=0;
int main(){
Pre();
scanf("%d%d%d",&A,&B,&C);
p[0]=1;
for(int i=0;i<=1000;i++){
int o=i;
while(o!=0){
p[i]++;
o/=10;
}
}
for(int i=10;i<=999;i++){
w[i]=w[i/10]+w[i%10];
sta[i]=(sta[i/10]<<7)+sta[i%10];
}
//printf("%d         %d\n",sta[1],sta[5]);
ans=w[A]+w[B]+w[C];
for(int i=0;i<=999;i++){
for(int j=0;j<=999;j++){
if(p[i]==p[A]&&p[j]==p[B]&&p[i+j]==p[C]){
if(w[i]+w[j]+w[i+j]==w[A]+w[B]+w[C]){
int ls=TJ(i,A)+TJ(j,B)+TJ((i+j),C);
if(ls<ans) ans=ls;
}
}
}
}
//    printf("%d         %d\n",sta[1],sta[5]);
//    printf("%d",TJ(1,5));
printf("%d",ans);
getchar(); getchar(); getchar();
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: