算法学习----BFS----玩具蛇(蓝桥)

一.题目

 在学习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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值