#哈希,广搜#洛谷 2730 SSL 1692 魔板

2024-02-11 06:48
文章标签 哈希 ssl 洛谷 魔板 2730 1692

本文主要是介绍#哈希,广搜#洛谷 2730 SSL 1692 魔板,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目

求从初始状态最少需要多少步到目标状态。


分析

首先这道题显而易见就是广搜,不过怎样标记它的状态?
所以用哈希。
因为理论上最多需要8! =40320,按照经验来说40320*1.2=48384,不过因为它不是质数,所以就用48383


代码

#include <cstdio>
#include <cstring>
#define p 48383
using namespace std;
const char rules[3][8]={{'8','7','6','5','4','3','2','1'},{'4','1','2','3','6','7','8','5'},{'1','7','2','4','5','3','6','8'}};
char a[9],answer[p+1],list[p+1][9],hash[p+1][9],s[p+1]; int ans,f[p+1];
bool check(char *s){int k=0,i=0;for (int i=1;i<=8;i++) k=k*10+s[i]-48;int orig=k%p;while (i<p&&!strstr(hash[(orig+i)%p]+1,s+1)&&hash[(orig+i)%p][1]!='\0') i++;if (strstr(hash[(orig+i)%p]+1,s+1)) return true; else strcpy(hash[(orig+i)%p]+1,s+1); return false;
}
void print(int tail){if (!tail) return;print(f[tail]);if (answer[tail]!='@') s[++ans]=answer[tail];
}
void bfs(){int head=0,tail=1; answer[1]=64;strcpy(list[1]+1,"12345678"); strcpy(hash[12345678%p]+1,list[1]+1);do{head++;for (int i=0;i<3;i++){f[++tail]=head;//标记前一步answer[tail]=i+65;strcpy(list[tail]+1,list[head]+1);for (int j=1;j<=8;j++) list[tail][j]=list[head][rules[i][j-1]-48];if (check(list[tail])) tail--;//以前走过if (strstr(list[tail]+1,list[0]+1)){print(tail);return;} //到达目标}}while (head<tail);
}
int main(){for (int i=1;i<=8;i++) scanf("%d",&a[i]),a[i]+=48; strcpy(list[0]+1,a+1);if (strstr(list[0]+1,"12345678")) {putchar('0'); return 0;}//目标状态为初始状态bfs(); printf("%d\n",ans); puts(s+1);return 0;
}

这篇关于#哈希,广搜#洛谷 2730 SSL 1692 魔板的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/699123

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

usaco 1.3 Prime Cryptarithm(简单哈希表暴搜剪枝)

思路: 1. 用一个 hash[ ] 数组存放输入的数字,令 hash[ tmp ]=1 。 2. 一个自定义函数 check( ) ,检查各位是否为输入的数字。 3. 暴搜。第一行数从 100到999,第二行数从 10到99。 4. 剪枝。 代码: /*ID: who jayLANG: C++TASK: crypt1*/#include<stdio.h>bool h

哈希表的底层实现(1)---C++版

目录 哈希表的基本原理 哈希表的优点 哈希表的缺点 应用场景 闭散列法 开散列法 开放定值法Open Addressing——线性探测的模拟实现 超大重点部分评析 链地址法Separate Chaining——哈希桶的模拟实现 哈希表(Hash Table)是一种数据结构,它通过将键(Key)映射到值(Value)的方式来实现快速的数据存储与查找。哈希表的核心概念是哈希

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移?3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验,容易写出下面的代码 // UnorderedSet.h#pragma once#include "HashTable.h"

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

哈希表题总结

哈希表题总结 hot100两数之和字母异位词分组最长连续序列 hot100 两数之和 题目链接: 1.两数之和 代码: class Solution {public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> map = new HashMap<>();int n = nums.length;for

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。