文章目录
- 玩具蛇
- 题目描述
- 答案:552
- dfs
玩具蛇
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。
小蓝还有一个 4×4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16 个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
下图给出了两种方案:
请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。
答案:552
dfs
#include<bits/stdc++.h> // 包含STL库文件
using namespace std;
const int N=4; // 定义常量 N,表示 4x4 的方格大小
int g[N][N]; // 定义二维数组 g,用于表示方格的状态
int ans=0; // 定义变量 ans,用于累计所有可能的放置方案
// 定义移动方向数组 dir_x 和 dir_y,分别表示上、下、左、右的 x 和 y 方向移动
int dir_x[4]={-1,1,0,0};
int dir_y[4]={0,0,-1,1};
// 检查坐标 (x, y) 是否在方格内以及位置是否未被占用
bool check(int x,int y)
{
if(x>=0 && x<N && y>=0 && y<N && g[x][y]==0)
return true;
return false;
}
// 深度优先搜索函数 dfs,用于尝试放置玩具蛇
void dfs(int x,int y,int step)
{
if(step==16) // 如果已放置 16 节玩具蛇,说明找到一种方案
{
ans++; // 方案数增加
return;
}
for(int i=0;i<4;i++) // 遍历所有可能的四个方向
{
int tox=x+dir_x[i]; // 计算下一个 x 坐标
int toy=y+dir_y[i]; // 计算下一个 y 坐标
if(check(tox,toy)) // 检查下一个位置是否有效
{
g[tox][toy]=1; // 将位置标记为已占用
dfs(tox,toy,step+1); // 递归继续放置下一节
g[tox][toy]=0; // 回溯,将位置重置为未占用
}
}
}
int main()
{
// 循环尝试每个格子作为起始位置
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
g[i][j]=1; // 将当前位置标记为已占用
dfs(i,j,1); // 从当前位置开始深度优先搜索
g[i][j]=0; // 回溯,将位置重置为未占用
}
}
cout<<ans; // 输出所有可能的放置方案的数量
return 0;
}
在这段代码中,定义了一个 4x4 的方格来模拟题目中的盒子,然后使用深度优先搜索(DFS)算法尝试每种可能的玩具蛇的放置方式。每次我们在方格中放置一节玩具蛇时,会递增步数 step
。当 step
达到 16 时,意味着所有的玩具蛇部分都已放置在方格中,这时就找到了一种有效的放置方案,方案数 ans
就增加。整个搜索过程会遍历所有的格子作为起始点,并递归地搜索所有可能的路径,直到找到所有可能的放置方案。最后,输出 ans
得到总共有多少不同的放置方案。