博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HDU1195]Open the Lock
阅读量:5233 次
发布时间:2019-06-14

本文共 1843 字,大约阅读时间需要 6 分钟。

题目大意:给你一个4位数的初始状态(只包含1~9),要求你变化成另一个4位数。

变化规则为:每次可给任意一位加1或减1(1减1变为9,9加1变为1),或交换相邻两个数位上的数字(第一位和最后一位不相邻)。

要你求出最少的变化次数。

解题思路:这道题很明显是一道BFS的题,只不过变化的操作复杂了点。我使用了字符串进行处理。

一开始我用的是STL的string,后来我改成了C字符串,对比如下:

 

这充分说明了string的慢。。

操作虽然复杂,但耐心点还是能写好的。

具体见代码。

C++ Code:

#include
#include
#include
using namespace std;char n[5],m[5];struct sss{ int a; char s[5];};sss d[9002];bool b[10001];const int dd[]={1,-1};void bfs(){ int l=0,r=1; memset(b,0,sizeof(b)); d[1].a=0; strcpy(d[1].s,n); while(l!=r){ l=l%9000+1; for(int i=0;i<4;i++) for(int j=0;j<3;j++) if(j!=2){ char c[5]; strcpy(c,d[l].s); c[i]+=dd[j]; if(c[i]=='0')c[i]='9'; if(c[i]>'9')c[i]='1'; int f=atoi(c); if(!b[f]){ b[f]=1; r=r%9000+1; strcpy(d[r].s,c); d[r].a=d[l].a+1; if(strcmp(c,m)==0){ printf("%d\n",d[r].a); return; } } }else{ for(int k=0;k<=2;k++){ char c[5]; strcpy(c,d[l].s); char f=c[k]; c[k]=c[k+1]; c[k+1]=f; int ll=atoi(c); if(!b[ll]){ b[ll]=1; r=r%9000+1; strcpy(d[r].s,c); d[r].a=d[l].a+1; if(strcmp(c,m)==0){ printf("%d\n",d[r].a); return; } } } } }}int main(){ int o; scanf("%d",&o); while(o--){ scanf("%s",n); scanf("%s",m); if(strcmp(n,m)==0){ puts("0"); continue; } bfs(); }}

 

转载于:https://www.cnblogs.com/Mrsrz/p/6921374.html

你可能感兴趣的文章
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
【★】浅谈计算机与随机数
查看>>
《代码阅读方法与实现》阅读笔记一
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>
javascript面相对象编程,封装与继承
查看>>
Atlas命名空间Sys.Data下控件介绍——DataColumn,DataRow和DataTable
查看>>
Java中正则表达式的使用
查看>>
算法之搜索篇
查看>>
新的开始
查看>>
java Facade模式
查看>>
NYOJ 120校园网络(有向图的强连通分量)(Kosaraju算法)
查看>>
SpringAop与AspectJ
查看>>
Leetcode 226: Invert Binary Tree
查看>>
http站点转https站点教程
查看>>
解决miner.start() 返回null
查看>>
bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
查看>>
BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>