计蒜客 密码锁(BFS)
https://www.jisuanke.com/course/1797/121114
Description
现在一个紧急的任务是打开一个密码锁。密码由四位数字组成,每个数字从 1 到 9 进行编号。每次可以对任何数字加 1 或减 1。当将9加 1 时,数字将变为1,当1减 1 的时,数字将变为9。您也可以与邻居交换数字,每一个行动记做一步。现在你的任务是使用最小的步骤来打开锁。
注意:最左边的数字不是最右边数字的邻居。
Input
第一行输入四位数字,表示密码锁的初始状态。
第二行输入四位数字,表示开锁的密码。
Output
输出一个整数,表示最小步骤。
样例输入
样例输出
这道题最开始想不到用搜索来做。
不过这种题目还是很容易使用bfs来完成。
对于这道题目我们采用的标记方法和平时的标记也不太一样,我们是标记我们到达过的状态。
我们可以就是通过四维数组来完成标记,把由4个数字组成的一组密码记为一种状态,即:当密码为abcd时,对应的标记就应该记为vis[a][b][c][d]=1。
每次我们可以的操作有三种,第一种对于四位数字中的某一位加一,第二种对于四位数字中的某一位减一,第三种对于四位数字进行交换。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
using namespace std; struct node
{
int num[];
int step;
}first,last;
int vis[][][][]; void BFS()
{
queue<node> qe;
node t;
t=first;
qe.push(t);
vis[t.num[]][t.num[]][t.num[]][t.num[]]=;
while(!qe.empty())
{
t=qe.front();
qe.pop();
if(t.num[]==last.num[]&&t.num[]==last.num[]&&t.num[]==last.num[]&&t.num[]==last.num[])
{ //BFS出口
printf("%d\n",t.step);
return ;
}
for(int i=;i<;i++)//+1
{
node next=t;
next.num[i]++;
if(next.num[i]==) next.num[i]=;
if(!vis[next.num[]][next.num[]][next.num[]][next.num[]])
{
vis[next.num[]][next.num[]][next.num[]][next.num[]]=;
next.step++;
qe.push(next);
}
}
for(int i=;i<;i++)//-1
{
node next=t;
next.num[i]--;
if(next.num[i]==) next.num[i]=;
if(!vis[next.num[]][next.num[]][next.num[]][next.num[]])
{
vis[next.num[]][next.num[]][next.num[]][next.num[]]=;
next.step++;
qe.push(next);
}
}
for(int i=;i<;i++)//交换
{
node next=t;
swap(next.num[i],next.num[i+]);
if(!vis[next.num[]][next.num[]][next.num[]][next.num[]])
{
vis[next.num[]][next.num[]][next.num[]][next.num[]]=;
next.step++;
qe.push(next);
}
}
}
} int main()
{
#ifdef DEBUG
freopen("sample.txt","r",stdin);
#endif char str1[];
char str2[];
scanf("%s %s",str1,str2);
for(int i=;i<;i++)
{
first.num[i]=str1[i]-'';
last.num[i]=str2[i]-'';
}
BFS(); return ;
}
-
计蒜客 密码锁(BFS)的更多相关文章
- [计蒜客] 矿石采集【记搜、Tarjan缩点+期望Dp】
Online Judge:计蒜客信息学3月提高组模拟赛 Label:记搜,TarJan缩点,树状数组,期望Dp 题解 整个题目由毫无关联的两个问题组合成: part1 问题:对于每个询问的起点终点,求 ...
- 计蒜客 作弊揭发者(string的应用)
鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库 ...
- 计蒜客的一道题dfs
这是我无聊时在计蒜客发现的一道题. 题意: 蒜头君有一天闲来无事和小萌一起玩游戏,游戏的内容是这样的:他们不知道从哪里找到了N根不同长度的木棍, 看谁能猜出这些木棍一共能拼出多少个不同的不等边三角形. ...
- 计蒜客模拟赛5 D2T1 成绩统计
又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...
- 计蒜客 等边三角形 dfs
题目: https://www.jisuanke.com/course/2291/182238 思路: 1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长, ...
- 计蒜客 方程的解数 dfs
题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...
- 计蒜客 买书 dfs
题目: https://www.jisuanke.com/course/2291/182236 思路: 递归解决,从第一本书开始,每本书都有两种选择: //index是book里面每本书价格的下标, ...
- 计蒜客:Entertainment Box
Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fight ...
- 爬虫acm比赛成绩(多页成绩整合在一起、获取复制不了的数据)(hihocoder、计蒜客)
https://github.com/congmingyige/web-crawler_rank-of-competition-in-JiSuanKe-and-hihocoder 1. 计蒜客(获取复 ...
随机推荐
- 云时代架构阅读笔记九——web应用存在的问题及解决办法
web应用通常存在的10大安全问题 1.SQL注入 拼接的SQL字符串改变了设计者原来的意图,执行了如泄露.改变数据等操作,甚至控制数据库服务器, SQL Injection与Command Inje ...
- 3分钟学会Python 针对Excel操作
1.python 读取Excel # -*- coding: utf-8 -*- import xlrd import os,sys reload(sys) sys.setdefaultencodin ...
- 微信小程序添加背景图片的坑
给微信小程序页面加载背景图片解决方案 直接附上原文地址: 给微信小程序页面加载背景图片解决方案 - YUSIR 完美CODING世界 - CSDN博客 https://blog.csdn.net/y ...
- 实验吧-密码学-Decode、困在栅栏里的凯撒
Decode 这是一个多重加密. 0x253464253534253435253335253433253661253435253737253464253531253666253738253464253 ...
- vue学习(九)对象变更检测注意事项
Vue不能检测对象属性的添加和删除,要是必须这么做的话 需要使用 vue.$set() <body> <div id="app"> <h3> { ...
- 尝试用kotlin做一个app(五)
JSP后台管理系统 开发工具是IntelliJ IDEA+tomcat+mysql5.6.19+mysql-connector-java-5.1.48.jar+easyui+kindeditor 之前 ...
- django下载
pip install django ==2.0.5 创建目录 1创建目录 2终端下进入目录 3输入django-admin startproject project
- 2. Jetson TX2--python3下编译安装opencv3.4
https://cloud.tencent.com/developer/article/1327273 jetpack3.2自带了opencv3.3,但是只提供了python2.7的编译版本,所以也只 ...
- 9 —— node —— 读取文件及文件夹的名字
const fs = require('fs'); fs.readdir('./','utf8',(err,data)=>{ console.log(data) })
- css3 实现渐变边框
(1)一个渐变的底边线border:1px solid transparent;border-image: -webkit-linear-gradient(right, #FF9848,#FF2A2B ...