2016蓝桥杯C/C++省赛 剪邮票(深搜DFS+暴力)
2017-03-21 12:03
246 查看
题目:
思路:
先枚举一下组合数,也就是C(12,5)=792种可能,然后判断每一种可能是否连通,那怎么判连通呢?因为我的num[1]~num[5]存储的是那五个数,所以我们判断如果从num[1]能走到num[2]~num[5]中的任意一个点的话,就证明这一片区域是连通的,用一个flag变量来记录从num[1]走到其他点成功的次数,总共有四种可能(1~2,1~3,1~4,1~5),如果都能走到的话,那么flag的值应该是4,这样的话就证明连通一个去区域了,所以就把cntt++,最后输出cntt的值就行,(x1,y1)代表的是起始点的坐标,(x2,y2)代表终点的坐标,注意实时更新,感觉时间复杂度有点高,但是才跑了0.033s...
代码:
思路:
先枚举一下组合数,也就是C(12,5)=792种可能,然后判断每一种可能是否连通,那怎么判连通呢?因为我的num[1]~num[5]存储的是那五个数,所以我们判断如果从num[1]能走到num[2]~num[5]中的任意一个点的话,就证明这一片区域是连通的,用一个flag变量来记录从num[1]走到其他点成功的次数,总共有四种可能(1~2,1~3,1~4,1~5),如果都能走到的话,那么flag的值应该是4,这样的话就证明连通一个去区域了,所以就把cntt++,最后输出cntt的值就行,(x1,y1)代表的是起始点的坐标,(x2,y2)代表终点的坐标,注意实时更新,感觉时间复杂度有点高,但是才跑了0.033s...
代码:
#include <stdio.h> #include <string.h> #include <string> #include <iostream> #include <stack> #include <queue> #include <vector> #include <algorithm> #define mem(a,b) memset(a,b,sizeof(a)) #define inf 0x3f3f3f3f #define N 1000+10 #define LL long long using namespace std; int num[10],cntt=0,flag; int vis[10][10]; int go[4][2]={1,0,-1,0,0,1,0,-1}; int x2,y2; int judge(int x,int y)//判断这个点是否在这五个点内 { int k=4*(x-1)+y;//坐标转换成数字 for(int i=1;i<=5;i++) { if(k==num[i]) return 1; } return 0; } void dfs(int x1,int y1) { if(x1==x2&&y1==y2) { flag++; return; } for(int i=0; i<4; i++) { int xx=x1+go[i][0]; int yy=y1+go[i][1]; if(xx>=1&&xx<=3&&yy>=1&&yy< 4000 =4&&vis[xx][yy]==0&&judge(xx,yy)) { vis[xx][yy]=1; dfs(xx,yy); } } } void init(int nn,int mm) { int i; if(mm==0)//当mm==0时,num[1]~num[5]中存储的就是枚举的这五个数 { flag=0;//初始化flag int x1=(num[1]-1)/4+1;//把数值num[1]转换成坐标的形式 int y1=(num[1]-1)%4+1; for(int i=2; i<=5; i++)//搜索从num[1]分别走到num[2]~num[5],如果都可以走到的话,证明这一片区域是连通的 { x2=(num[i]-1)/4+1;//转换成坐标 y2=(num[i]-1)%4+1; mem(vis,0);//标记数组清零 vis[x1][y1]=1;//标记当前点 dfs(x1,y1);//从起点开始搜索 } if(flag==4)//一共有四种可能,如果都能走得通,就证明这一片区域连通 cntt++; return; } for(int i=nn; i>=mm; i--)//枚举组合数 { num[mm]=i; init(i-1,mm-1); } } int main() { init(12,5);//枚举组合数,在12个数中选5个数的组合 cout<<cntt<<endl; }
相关文章推荐
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第三题:李白打酒【暴力】or【DFS】
- 蓝桥杯-【方格填数】【2016年省赛B组题解】【C++】——暴力破解
- 2016 第七届蓝桥杯 c/c++ B组省赛感受
- 2016第七届蓝桥杯C/C++ B组省赛第三题:凑算式
- 2016第七届蓝桥杯C/C++ B组省赛第二题:生日蜡烛
- 2013年第四届蓝桥杯C/C++省赛 第39级台阶(结果填空) ----DFS深度搜索遍历和暴力搜索
- 2016第七届蓝桥杯C/C++ B组省赛第五题:抽签
- 2016年蓝桥杯省赛A组C/C++ 第二题 跳蚱蜢(dfs搜索+状态压缩)
- [蓝桥杯] 第七届 C/C++ B组 剪邮票 ---- DFS
- 【DFS填数】(2016)第七届蓝桥杯省赛 C/C++ A组 题解(第三题)
- 蓝桥杯 2016 省赛B组 四平方和 (暴力)
- 2016 蓝桥杯 C/C++ B组 省赛 练习题(上半部分)
- 2016-年蓝桥杯C-(A组)赛题-dfs-剪邮票
- 【暴力循环】(2016)第七届蓝桥杯省赛 C/C++ A组 题解(第八题)
- 2016 第七届 蓝桥杯第7题 剪邮票(bfs+dfs)
- 2016第七届蓝桥杯C/C++ B组省赛第一题:煤球数目
- 2016第七届蓝桥杯 C/C++省赛第9题 交换瓶子
- 2016第七届蓝桥杯--剪邮票(DFS)
- 2016第七届蓝桥杯C/C++ B组省赛第四题
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第七题:六角填数【暴力】or【DFS】