题目描述
题目来源:2020蓝桥杯国赛
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有一条玩具蛇,一共有 16节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90度角。
小蓝还有一个 4×4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
下图给出了两种方案:
请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
思路:
1. 本题题意可以理解为从4*4的任意格子出发,每次走一个格子(只能走上、下、左、右相邻的四个格子),直到走完所有格子,求不同行走方案个数;
2. 使用DFS以每一个格子为起点开始遍历,统计可以遍历到所有格子的方案数;
3. 遍历时可以用一个二维数组来对已遍历的格子做标记;
4. 遍历时检查标记数组来判断路径是否满足要求(即是否所有的格子已被访问);
//2020g 玩具蛇
#include <iostream> vxgzh:xtsn
using namespace std;
#include <vector>
int c=0;
bool abc(vector<vector<bool> >v) //判断格子是否已被全部访问
{
for(vector<bool> i: v)
{
for(auto j:i)
if(j==false)
return false;
}
// for(int i=0;i<4;i++)
// for(int j=0;j<4;j++)
// if(v[i][j]==false)
// return false;
return true;
}
void dfs(int x,int y,vector<vector<bool> >v) //x,y表示坐标,v表示4*4格子被占用的状态,true表示被占用
{
if(x>=4||x<0||y>=4||y<0||v[x][y]==true) return ; //判断边界
v[x][y]=true;
if(abc(v)) //恰好占用4*4个格子
{
c++;
return ;
}
dfs(x+1,y,v); //下 //枚举所有情况
dfs(x-1,y,v); //上
dfs(x,y+1,v); //右
dfs(x,y-1,v); //左
}
int main()
{
int x,y;
vector <vector<bool> > v(4,vector<bool>(4,false));
for(x=0;x<4;x++)
for(y=0;y<4;y++)
dfs(x,y,v); //从每一个格子出发作DFS遍历
cout<<c<<endl;
return 0;
}