剪邮票
题目:
如【图1.jpg】, 有12张连在一起的12生肖的邮票。
现在你要从中剪下5张来,要求必须是连着的。 (仅仅连接一个角不算相连)
比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
答案是:116
思路:这题说实话刚开始懵了,DFS吧 感觉并不是,因为深搜的话 选一个就往回走了,感觉不是。 然后再想别的办法 ,果然蓝桥杯的题目暴力很强大,暴力出奇迹真没错。。 我就是暴力过的。。。
但是如果真的是比赛现场,哪里来的那么久的时间做呢? 做了一个多小时吧 主要是找BUg 找了很久。 总结一下,蓝桥杯一定要自己验证一下自己代码是否正确,就算验证不了,也把结果输出来看看
至少输出来的结果保证都是对的 !!! 切记!! 这也花不了多少时间 但是却能很大程度提高正确率 个人认为很不错!!!
好了 不讲废话了 思路是 : 题目就1-12个数字 你选择五个数字出来暴力,所有情况也不多计算机一秒内跑出来足够了 。 你先选出5个数字 判断这五个数字是否符合条件 判断条件也是暴力
只要人一个数字和其它数字相差1或者4就是相邻了,但是有特例(4 5 和8 9)特判一下就够了 注意还用了一下并查集,联通的归为一块 最后看是否是一块就好了
看代码:
#include<iostream> #include<math.h> #include<algorithm> using namespace std; int a[5]; int node[13]; int ans=0; void Init() { for(int i=0;i<13;i++) node[i]=i; } int Find(int x) { if(x==node[x]) return x; return node[x]=Find(node[x]); } void Union(int x,int y) { x=Find(x); y=Find(y); if(x!=y) node[x]=y; return ; } void judge() { int flag=0; Init(); for(int i=0;i<5;i++) { flag=0; for(int j=0;j<5;j++) { int z=abs(a[i]-a[j]); if((z==1||z==4)&&(!(a[i]==4&&a[j]==5))&&(!(a[i]==8&&a[j]==9))&&(!(a[i]==5&&a[j]==4))&&(!(a[i]==9&&a[j]==8))) { //&&(!(a[i]==5&&a[j]==4))&&(!(a[i]==9&&a[j]==8)) //cout<<"**"<<endl; Union(a[i],a[j]); flag=1; //break; } } if(flag==0) return ; } //for(int i=0;i<5;i++) cout<<a[i]; //cout<<endl; int cnt=Find(a[0]); for(int i=0;i<5;i++) { if(Find(a[i])!=cnt) return ; } // for(int i=0;i<5;i++) cout<<a[i]; // cout<<endl; ans++; return ; } int main() { for(int i=1;i<=12;i++) { a[0]=i; for(int j=i+1;j<=12;j++) { a[1]=j; for(int k=j+1;k<=12;k++) { a[2]=k; for(int l=k+1;l<=12;l++) { a[3]=l; for(int r=l+1;r<=12;r++) { a[4]=r; judge(); } } } } } cout<<ans<<endl; return 0; }
当初的梦想实现了吗,事到如今只好放弃吗~