链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网八数码
You will receive a description of a configuration of the 8 puzzle. The description is just a list of the tiles in their initial positions, with the rows listed from top to bottom, and the tiles listed from left to right within a row, where the tiles are represented by numbers 1 to 8, plus 'x'.You will print to standard output either the word ``unsolvable'', if the puzzle has no solution, or a string consisting entirely of the letters 'r', 'l', 'u' and 'd' that describes a series of moves that produce a solution. The string should include no spaces and start at the beginning of the line.
此题堪称深搜广搜的完美结合,外加数据处理能力的考察,不可多得,值得多做(还不是因为你想不出来)!QAQ
核心思想:可以通过广搜进行下一步状态的确定,并且要有对重复的判断以免多走,同时由于广搜的性质决定了一定是最小步数;直到找到预期的答案停止查找,后通过之前记录的信息深搜递归一步步返回进行答案的输出。我们将数字串直接转化为字符串(若当成九位数字会是longlong类型,比较麻烦),并用map映射成一个数字,用以标记是否记录过某字符串,并提供找到答案时的标号用以回溯;q记录访问编号,问为啥不直接记录探索过的string?因为需要广搜起点的标号用以回溯,所以就用q存标号,这样只要再加一个数字映射为字符串的数组就行了;a的string类型字符串就是用做这个。
细节问题:回溯时的初始标号当然是找到答案时的数字了;好好想想操作到底对应着哪个方向QAQ
#include
#include
#include
#include
#include
#include
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
[NOIP2002]字串变换
已知有两个字串 A, B及一组字串变换的规则(至多6个规则):
A1 -> B1
A2 -> B2
规则的含义为:在A中的子串 A1可以变换为 B1、A2可以变换为 B2 …。
例如:A='abcd' B='xyz'
变换规则为:
‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’
则此时,A 可以经过一系列的变换变为 B,其变换的过程为:
‘abcd’->‘xud’->‘xy’->‘xyz’
共进行了三次变换,使得A变换为B。
此题最主要的卡壳点在于,如果让原字符串与答案字符串双向奔赴,那么就可以将问题规模减少一半,从而减少不必要的运行时间与占用内存;
细节问题:1、不要死板回溯ans,可以开一个dis数组存放步数;2、要是数组空间给得比较紧,可以通过使用vector,用多少拿多少;3、while(cin>>a[n]>>b[n]) n++ 读到返回1,否则返回0 ;4、scanf("%d%d%d") 读够3个数返回3,没读够返回EOF 。
string用法整理:
判断是否字符串中没有指定子串:str.find(substr)==string::npos
指定位置之后子串位置:str.find(substr, pos)
替换字符串中指定子串:str.replace(pos, len, targetstr)
擦除指定部位子串:str.erase(pos, substr.length)
指定部位插入子串,原位置字符后移:str.insert(pos, substr)
memset使用细节:memset(array,0,sizeof(array)) 清空array时,若array是作为指针传入则会无法获取sizeof(array),所以不能在函数中对传入的指针直接使用memset。
#include
#include
#include
#include
#include
#include
又是被自己菜枯的一天QAQ