最近在学bfs,觉得这个题不错,自己没做出来,去网上搜了一下,又结合了我自己的想法,ac了;
这个看起来用dfs比较好做,但是会超时好像,所以肯定用bfs了。
问题描述:
在九宫格里放在1到8共8个数字还有一个是x,与x相邻的数字可以移动到x的位置,问给定的状态最少需要几步能到达目标状态:
1 2 3
4 5 6
7 8 x
输入:
输入一个初始状态;
输出:
到达目标状态所需要的最少步数;
样例:
输入:
1 2 3
x 4 6
7 5 8
输出:
19
思路:
首先,可以根据输入的初始状态直接判断此题是否有解,无解的情况直接输出-1就ok了;
具体方法是:将输入的九个数存到一个一维数组,假设f(1)为数字1在数组位置中在1前面比1小的数,
f(2)为数字2在数组位置中,在2前面比2小的数,.........,直到f(8),将f(1)+f(2).....到f(8)的值相加,
如果得到的数是偶数则有解,奇数则无解。
然后,将每个状态的九宫格替换成一个整数表示,例如样例 123046758,x替换成0,然后用map,来存储状态是否被 访问过,这样只需遍历0所在位置可以移动的方向,如果没有出界的话,求出移动后的九宫格状态,压入队列中,直到目标解,返回最少步数。具体实现请看代码。
ac代码:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include