原题链接:蓝桥杯历届试题-九宫重排
用bfs搜索一下即可,用的string一维来代替二维的迷宫,用二维的char二维数组来查重我想不到,而用string只要用string的set即可;
需要注意的是搜索二维的上下左右变成一维后需要改动,注意边界:0 <= x <=8,并且在此基础上有一些特殊情况,
如x=2,若+1 == 3,在0 <= x <=8内,但却是出界的
参考代码:
#include<bits/stdc++.h> using namespace std; string s1, s2; int dir[4] = {1, -1, 3, -3}; struct node{ int x, step; string str; node() : x(), step(){} node(int xx, int s) : x(xx), step(s){} }; int in(int x, int i){//判断是否出界 if(x + i >= 0 && x + i < 9){ if(x == 2 && i == 1 || x == 3 && i == -1 || x == 5 && i == 1 || x == 6 && i == -1){ return 0; } return 1; } return 0; } void bfs(node s){ int x, xx; queue<node> q; set<string> st; st.insert(s1); q.push(s); node now; node end; while(!q.empty()){ now = q.front(); x = now.x; q.pop(); if(now.str == s2){ cout<<now.step; return; } for(int i = 0; i < 4; i++){ end = now; if(in(x, dir[i])){ xx = x + dir[i]; swap(end.str[xx], end.str[x]); if(!st.count(end.str)){ end.step += 1; end.x = xx; q.push(end); st.insert(end.str); } } } } } int main(){ cin>>s1>>s2; int x = s1.find("."); node s(x, 0); s.str = s1; bfs(s); return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复