4位开锁<dfs>
来源:互联网 发布:.杀破狼 - js 编辑:程序博客网 时间:2024/04/29 22:05
题意:
有一个四位密码的锁,每一位是1~9的密码,1跟9相连。并且相邻的连个密码位可以交换。每改变一位耗时1s,给出锁的当前状态和密码,求最少解锁时间。
思路:
用bfs枚举出所有相邻交换的情况,并记录时间,然后每一位与密码比较,得出最少时间。注意输入的是一个数字,要把每一位提取出来。
代码:
#include <iostream>#include <cstring>#include <cmath>using namespace std;int visit[4]={0},ss,a[4],b[4]; //visit记录a[i]是否被访问,ss用来记录暴力过程中的最小值int cmp(int s) //这个是用来记录从当前这样的状态不左右移动最少要多少次{ int i,sum,aa[4]={s/1000,s/100%10,s/10%10,s%10}; //因为进来的是一个数字,所以用数组把它阉了,嘿嘿 for(i=sum=0;i<4;i++) //一位一位的开锁 { if(abs(aa[i]-b[i])<5)sum+=abs(aa[i]-b[i]); else sum+=9-abs(aa[i]-b[i]); } return sum;}void dfs(int sum,int s) //dfs里面进来的sum是当前的这个合成的数字,也就是不停移动得到的数组,s是记录移动次数{ int i; if(sum>999) //当sum>999也就是说sum是一个四位数时说明新的那个开锁初始状态OK了 { i=cmp(sum)+s; //这时把sum和数组b开锁的次数和用s记录的移动的次数记录下来 if(i<ss)ss=i; //比较,ss记录最小开锁操作 return; } for(i=0;i<4;i++) { if(!visit[i]) { visit[i]=1; dfs(sum*10+a[i],s++); //要是你聪明,会看到这里的一个重要的步骤,就是s++,别小看了,这说明下一次再在for循环里面取数就是在这次的数移动一位得到的,本体就是这个才是重点呢 visit[i]=0; } }}int main (void){ int i,j,n,m,t; cin>>t; while(t--&&cin>>n>>m) { for(i=3,j=1;i>=0;i--,j*=10) { a[i]=n/j%10; b[i]=m/j%10; } ss=99999; dfs(0,0); cout<<ss<<endl; }return 0;}
0 0
- 4位开锁<dfs>
- 开锁
- 开锁
- poj2965 位压缩+dfs
- 【3093】开锁
- poj1416--Shredding Company(搜索练习4,按位dfs)
- 八皇后 位运算dfs
- poj1143 DP+dfs+位运算- -
- hdu 5014(dfs + 位运算)
- UVA-818 dfs + 位运算
- 开锁技能1-375
- 唤醒手机屏幕并开锁
- 调度器开锁上锁
- 调度器开锁上锁
- #1075 : 开锁魔法III
- POJ 1830(位运算+双向DFS)
- POJ 1753 Flip Game ------- DFS & 位运算 .
- 任务分配问题-DFS\位运算
- 最小生成树
- Myeclipse修改项目名称,而发布到Tomcat上的项目名称却未修改。
- 《React-Native系列》6、Navigator语法介绍及经典应用
- 2016多校联赛4A Another Meaning(hdu 5763)
- 自学线段树的一些最最基本的操作
- 4位开锁<dfs>
- 可并堆之左偏树总结
- 重学 Statistics, Cha15 Multiple Regression
- Understanding Photometric and Radiometric units and their application to computer graphics
- 求全排列
- 垃圾收集器概述
- 顺序统计量
- Scroller相关类使用大揭秘
- 一起talk C栗子吧(第一百七十九回:C语言实例--字符和字符串输出函数二)