一.题目
在学习BFS中遇到的题目,可使用BFS暴力求解。
二.解题思路:
1.首先需要解决的问题是如何存储这个图,此处采用二维数组的方式存储。
2.编写main,在主函数中循环每一个位置作为一次排列的起点。
3.编写bfs函数:
(1)首先确认递归退出的条件,此处为当剩余的关节数为0时,返回;
(2)编写递归部分代码,类似与走迷宫问题,通过前面设的mx与my作为下一个关节所安放的位置(按照数组所排的顺序依次为北东南西);
(3)判断该位置是否能放下玩具蛇的关节(是否超出二维数组,该位置是否已经安放了玩具蛇的关节);
(4)在能放下关节的位置标记为1(正常未放置为0);
(5)如果北东南西四次遍历都没能进行下一步放置(即深度遍历到头了),此时需要返回到上一步的位置(上一次放置关节的位置)。
4.注意: (1)在返回到上一位置前,一定要将该位置的标记取消(即换成0);
(2)在主函数中,由于直接将起点处的作了标记,在下一次更换起点进行bfs之前需要将之前起点的标记取消。
三.代码
#include <iostream>
using namespace std;
//布置
int a[4][4];
int sum = 0;
int mx[4] = {0,1,0,-1};
int my[4] = {-1,0,1,0};
bool bfs(int x,int y,int k){
if(k == 0){ //剩余关节数
sum++;
return true;
}
for(int i=0;i<4;i++){
int x_next = x + mx[i];
int y_next = y + my[i];
if(x_next>=0 && x_next<4 && y_next>=0 && y_next<4 && a[x_next][y_next]==0){
k--;
a[x][y] = 1;
bfs(x_next,y_next,k);
a[x_next][y_next] = 0;
k++;
}
}
return false;
}
int main()
{
int k = 16;
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
bfs(i,j,k-1);
a[i][j] = 0;
}
}
cout<<sum<<endl;
return 0;
}