C++ 八数码问题宽搜
题目描述
样例输入
(none)
样例输出
H--F--A
AC代码
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int ju[9][9] = {{0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,0,1,1},
{0,0,1,1,1,1,0,1,1},
{0,0,1,1,0,0,1,1,1},
{0,0,1,0,1,1,1,0,1},
{0,1,1,0,1,1,1,0,0},
{0,0,0,1,1,1,1,1,0},
{0,1,1,1,0,0,1,1,0},
{0,1,1,1,1,0,0,0,1}};//整个矩阵图
int a[101],b[101];
bool s[9];//true为不可走 false为可走 为了避免重复
void out(int d)//作用是把数组按char型输出
{
cout << char(a[d] + 64);//一个数 + 64输出才是char型 不加会乱码
while (b[d])//重复输出,直到没有数为止
{
d = b[d];
cout << "--" << char(a[d] + 64);//后面的数字用"--"隔开
}
cout << endl;
}
void doit()
{
int head,tail,i;
head = 0;tail = 1;
a[1] = 1;
b[1] = 0;
s[1] = 1;
do//重复执行直到出队下标 <= 入队下标 保证不越位 (head < tail)
{
head ++;//head是出队下标
for (i = 1;i <= 8;i ++)//这是bfs移动的八个方向
{
if (ju[a[head]][i] == 0 && s[i] == 0)//如果枚举到的这个方向能走,并且以前没有走过,那就入队
{
tail ++;//入队下标 + 1
a[tail] = i;//入队都入队
b[tail] = head;
s[i] = 1;//把当前位置标为已经走过
if (i == 8)//如果这是最后一次循环,就因该输出了
{
out(tail);//输出函数
head = tail;//
break;//直接退出
}
}
}
}while (head < tail);
}
int main()
{
memset(s,false,sizeof(s));//把s下标里的元素全部初始化为False
doit();//调用
return 0;//
}