题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1430

思路:由于只是8种颜色,所以标号就无所谓了,对起始状态重新修改标号为 12345678,对目标状态标号做相应的修改,先预处理出12345678到所有状态的路径,记录所有状态的pre值,直接输出即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<string>
  7. using namespace std;
  8.  
  9. struct Node{
  10. char str[];
  11. Node(){};
  12. Node(char _str[]){
  13. for(int i=;i<;i++){
  14. str[i]=_str[i];
  15. }
  16. }
  17. };
  18.  
  19. int fac[]={,,,,,,,,};
  20. int Get_Hash(Node &p)
  21. {
  22. int val=;
  23. for(int i=;i<;i++){
  24. int cnt=;
  25. for(int j=;j<i;j++){
  26. if(p.str[j]>p.str[i])cnt++;
  27. }
  28. val+=cnt*fac[i];
  29. }
  30. return val;
  31. }
  32.  
  33. void Move_A(Node &p)
  34. {
  35. reverse(p.str,p.str+);
  36. }
  37.  
  38. void Move_B(Node &p)
  39. {
  40. char ch=p.str[];
  41. for(int i=;i>=;i--)p.str[i]=p.str[i-];
  42. p.str[]=ch;
  43. ch=p.str[];
  44. for(int i=;i<=;i++)p.str[i]=p.str[i+];
  45. p.str[]=ch;
  46. }
  47.  
  48. void Move_C(Node &p)
  49. {
  50. swap(p.str[],p.str[]);
  51. swap(p.str[],p.str[]);
  52. swap(p.str[],p.str[]);
  53. }
  54.  
  55. int pre[],ans[];
  56. bool mark[];
  57.  
  58. void BFS()
  59. {
  60. queue<Node>que;
  61. que.push(Node(""));
  62. memset(mark,false,sizeof(mark));
  63. mark[]=true;
  64. while(!que.empty()){
  65. Node p=que.front();
  66. que.pop();
  67. int p_val=Get_Hash(p);
  68. Node q(p);
  69. Move_A(q);
  70. int q_val=Get_Hash(q);
  71. if(!mark[q_val]){
  72. mark[q_val]=true;
  73. pre[q_val]=p_val;
  74. ans[q_val]='A';
  75. que.push(q);
  76. }
  77. q=p;
  78. Move_B(q);
  79. q_val=Get_Hash(q);
  80. if(!mark[q_val]){
  81. mark[q_val]=true;
  82. pre[q_val]=p_val;
  83. ans[q_val]='B';
  84. que.push(q);
  85. }
  86. q=p;
  87. Move_C(q);
  88. q_val=Get_Hash(q);
  89. if(!mark[q_val]){
  90. mark[q_val]=true;
  91. pre[q_val]=p_val;
  92. ans[q_val]='C';
  93. que.push(q);
  94. }
  95. }
  96. }
  97.  
  98. char S[],T[];
  99. int SS[];
  100. int main()
  101. {
  102. BFS();
  103. while(~scanf("%s%s",S,T)){
  104. for(int i=;i<;i++)SS[S[i]-'']=i;
  105. for(int i=;i<;i++)T[i]=SS[T[i]-'']+'';
  106. Node p=Node(T);
  107. int val=Get_Hash(p);
  108. string ss="";
  109. while(val){
  110. ss+=ans[val];
  111. val=pre[val];
  112. }
  113. reverse(ss.begin(),ss.end());
  114. cout<<ss<<endl;
  115. }
  116. return ;
  117. }

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3567

思路:因为这题有一个特殊的点X,所以枚举X的位置,打出9张前驱表,用魔板题一样的方法将两个状态的对应标号转化,输出就好了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<queue>
  7. using namespace std;
  8.  
  9. struct Node{
  10. int map[][];
  11. int x,y;
  12. Node(){}
  13. Node(char *str){
  14. for(int i=,xx=,yy=;str[i];i++){
  15. map[xx][yy]=str[i];
  16. if(str[i]=='X'){ x=xx,y=yy; }
  17. yy++;
  18. if(yy==)xx++,yy=;
  19. }
  20. }
  21. }S;
  22.  
  23. int fac[]= {,,,,,,,,};
  24. //康拓展开
  25. int Get_Hash(Node &p)
  26. {
  27. char str[];
  28. int val=;
  29. for(int i=;i<;i++){
  30. for(int j=;j<;j++){
  31. str[i*+j]=p.map[i][j];
  32. int cnt=;
  33. for(int k=i*+j-;k>=;k--){
  34. if(str[k]>str[i*+j])cnt++;
  35. }
  36. val+=fac[i*+j]*cnt;
  37. }
  38. }
  39. return val;
  40. }
  41.  
  42. int dir[][]={{,},{,-},{,},{-,}};
  43. char Dir[]="dlru";
  44. int pre[][];
  45. char ans[][];
  46. bool mark[];
  47.  
  48. void bfs(int x)
  49. {
  50. memset(pre[x],-,sizeof(pre[x]));
  51. memset(mark,false,sizeof(mark));
  52. queue<Node>que;
  53. que.push(S);
  54. mark[Get_Hash(S)]=true;
  55. while(!que.empty()){
  56. Node p=que.front();
  57. que.pop();
  58. int p_val=Get_Hash(p);
  59. for(int i=;i<;i++){
  60. Node q=p;
  61. q.x=p.x+dir[i][],q.y=p.y+dir[i][];
  62. if(q.x<||q.x>=||q.y<||q.y>=)continue;
  63. q.map[p.x][p.y]=q.map[q.x][q.y];
  64. q.map[q.x][q.y]='X';
  65. int q_val=Get_Hash(q);
  66. if(mark[q_val])continue;
  67. mark[q_val]=true;
  68. pre[x][q_val]=p_val;
  69. ans[x][q_val]=Dir[i];
  70. que.push(q);
  71. }
  72. }
  73. }
  74.  
  75. char str[];
  76. int num[];
  77. int main()
  78. {
  79. S=Node("X12345678");
  80. bfs();
  81. S=Node("1X2345678");
  82. bfs();
  83. S=Node("12X345678");
  84. bfs();
  85. S=Node("123X45678");
  86. bfs();
  87. S=Node("1234X5678");
  88. bfs();
  89. S=Node("12345X678");
  90. bfs();
  91. S=Node("123456X78");
  92. bfs();
  93. S=Node("1234567X8");
  94. bfs();
  95. S=Node("12345678X");
  96. bfs();
  97.  
  98. int _case,p,t=;
  99. scanf("%d",&_case);
  100. while(_case --){
  101. scanf("%s", str);
  102. for(int i = , j = ; i <= ; i ++ ){
  103. if(str[i] != 'X') num[str[i] - ''] = j ++;
  104. else p = i;
  105. }
  106. scanf("%s", str);
  107. for(int i=;i<=;i++){
  108. if(str[i]=='X')continue;
  109. str[i]=num[str[i]-'']+'';
  110. }
  111. S=Node(str);
  112. int val=Get_Hash(S);
  113. string ss="";
  114. while(val!=-){
  115. ss+=ans[p][val];
  116. val=pre[p][val];
  117. }
  118. reverse(ss.begin(), ss.end());
  119. printf("Case %d: %d\n",t++,ss.size()-);
  120. for(int i=;i<ss.size();i++)cout<<ss[i];
  121. cout<<endl;
  122. }
  123. return ;
  124. }

hdu 1430+hdu 3567(预处理)的更多相关文章

  1. HDU 1430 魔板(康托展开+BFS+预处理)

    魔板 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  2. hdu 5317 合数分解+预处理

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)

    最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...

  4. POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)

    思路: 这三个题是一个比一个令人纠结呀. POJ-1077 爆搜可以过,94ms,注意不能用map就是了. #include<iostream> #include<stack> ...

  5. hdu 1430 魔板 (BFS+预处理)

    Problem - 1430 跟八数码相似的一题搜索题.做法可以是双向BFS或者预处理从"12345678"开始可以到达的所有状态,然后等价转换过去直接回溯路径即可. 代码如下: ...

  6. HDU - 1430 魔板 (bfs预处理 + 康托)

    对于该题可以直接预处理初始状态[0, 1, 2, 3, 4, 5, 6, 7]所有可以到达的状态,保存到达的路径,直接打印答案即可. 关于此处的状态转换:假设有初始状态为2,3,4,5,0,6,7,1 ...

  7. HDU - 1430 魔板 【BFS + 康托展开 + 哈希】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1430 思路 我刚开始 想到的 就是 康托展开 但是这个题目是 多组输入 即使用 康托展开 也是会T的 ...

  8. hdu 1430 魔板 康托展开 + 很好的映射

    http://acm.hdu.edu.cn/showproblem.php?pid=1430 如果从start ---> end,每一次都bfs进行,那么就肯定会超时. 考虑到先把start映射 ...

  9. hdu 1430 (BFS 康托展开 或 map )

    第一眼看到这题就直接BFS爆搜,第一发爆了内存,傻逼了忘标记了,然后就改,咋标记呢. 然后想到用map函数,就8!个不同的排列,换成字符串用map标记.然后又交一发果断超时,伤心,最恨超时,还不如来个 ...

随机推荐

  1. 【原创】express3.4.8源码解析之路由中间件

    前言 注意:旧文章转成markdown格式. 跟大家聊一个中间件,叫做路由中间件,它并非是connect中内置的中间件,而是在express中集成进去的. 显而易见,该中间件的用途就是 ------ ...

  2. sql重复记录查询

    1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select  peopleId  fro ...

  3. js实现把网页table导成Excel

    //导出excel function exportExcel(DivID,strTitle){ if(DivID==null) { return false; } var jXls, myWorkbo ...

  4. php substr中文乱码最有效到解决办法 转:http://blog.sina.com.cn/s/blog_49b531af0100esah.html

    (2009-07-29 12:29:38) 转载▼ 标签: php substr文乱码 网站开发 it   直接使用PHP函数substr截取中文字符可能会出现乱码,主要是substr可能硬生生的将一 ...

  5. Stanford机器学习---第八讲. 支持向量机SVM

    原文: http://blog.csdn.net/abcjennifer/article/details/7849812 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回 ...

  6. Procrustes Analysis普氏分析法

    选取N幅同类目标物体的二维图像,并用上一篇博文的方法标注轮廓点,这样就得到训练样本集: 由于图像中目标物体的形状和位置存在较大偏差,因此所得到的数据并不具有仿射不变性,需要对其进行归一化处理.这里采用 ...

  7. win8.1禁用和去除SkyDrive任务栏图标方法

    Win+R打开运行,输入gpedit.msc确定,打开本地组策略编辑器. 依次定位到:计算机配置-管理模板-Windows组件-OneDrive,双击阻止使用 OneDrive 执行文件储存.

  8. 自编译ngrok服务器

    转载:http://www.haiyun.me/archives/1012.html 首先安装GO环境,http://www.haiyun.me/archives/1009.html 1 2 3 4 ...

  9. 试试markdown

    看看有没有wrapper... list first list second list third list fourth list in list 1 list list list > < ...

  10. 《ASP.NET1200例》各种类型文件汇总

    aspx是页面文件 ascx是用户控件,用户控件必须嵌入到aspx中才能使用. ascx是用户控件,相当于模板 其实ascx你可以理解为Html里的一部分代码, 只是嵌到aspx里而已, 因为aspx ...