• 845. 八数码(Acwing)


    在一个 3×33×3 的网格中,1∼81∼8 这 88 个数字和一个 x 恰好不重不漏地分布在这 3×33×3 的网格中。

    例如:

    1. 1 2 3
    2. x 4 6
    3. 7 5 8

    在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。

    我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

    1. 1 2 3
    2. 4 5 6
    3. 7 8 x

    例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。

    交换过程如下:

    1. 1 2 3 1 2 3 1 2 3 1 2 3
    2. x 4 6 4 x 6 4 5 6 4 5 6
    3. 7 5 8 7 5 8 7 x 8 7 8 x

    现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。

    输入格式

    输入占一行,将 3×33×3 的初始网格描绘出来。

    例如,如果初始网格如下所示:

    1. 1 2 3
    2. x 4 6
    3. 7 5 8

    则输入为:1 2 3 x 4 6 7 5 8

    输出格式

    输出占一行,包含一个整数,表示最少交换次数。

    如果不存在解决方案,则输出 −1−1。

    输入样例:

    2  3  4  1  5  x  7  6  8
    

    输出样例

    19

    解题思路:通过广搜进行遍历,取得最终答案

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int nx[] = {-1,0,0,1};
    7. int ny[] = {0,-1,1,0};
    8. int BFS(string str)
    9. {
    10. string end = "12345678x"; //末状态字符串
    11. //定义队列与dist数组
    12. queue que;
    13. unordered_mapint> dist;
    14. //初始化
    15. que.push(str);
    16. dist[str] = 0;
    17. while(que.size())
    18. {
    19. string temp = que.front();//中间变量
    20. que.pop();
    21. int distance = dist[temp];//状态变化得到最小值
    22. if(temp == end)return distance;
    23. int k = temp.find('x');//找到x所在位置
    24. int x = k / 3,y = k % 3;
    25. for(int i = 0; i < 4; i++)
    26. {
    27. int tx = x + nx[i];
    28. int ty = y + ny[i];
    29. if(tx < 0 || ty < 0 || tx > 2 || ty > 2)continue;
    30. swap(temp[k],temp[3 * tx + ty]); //状态改变
    31. if(!dist[temp])
    32. {
    33. //没变成过这种状态,则进行记录,并且步数加一
    34. dist[temp] = distance + 1;
    35. //加入队列中,继续遍历
    36. que.push(temp);
    37. }
    38. swap(temp[k],temp[3 * tx + ty]); //状态复原,为下一次转换做准备
    39. }
    40. }
    41. return -1;
    42. }
    43. int main()
    44. {
    45. string start,c;
    46. for(int i = 0; i < 9; i++)
    47. {
    48. cin>>c;
    49. start += c;
    50. }
    51. cout<<BFS(start)<//开始广搜,以初始字符串为参数
    52. return 0;
    53. }

  • 相关阅读:
    【SpringBoot】SpringBoot2之编写第一个HelloWorld
    STM32嵌入式开发需要掌握硬件、嵌入式系统、C编程语言以及相关的外设驱动等知识
    Day21:方法重写以及注意细节
    字体压缩神器font-spider的使用
    JAVA 0基础 数据类型 整数型
    当我们谈数据分析时,到底在谈什么?
    使用python编程数学建模-数据模块理论数据相似性常用基础指标(课程3)
    基于C/C++的UTF-8转GBK
    替代MySQL半同步复制,Meta技术团队推出MySQL Raft共识引擎
    pytorch基础学习(4)
  • 原文地址:https://blog.csdn.net/wswnbtfkpuqw/article/details/125998950