Problem:
小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。
小蓝还有一个 4 × 4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16 个字母。
小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
下图给出了两种方案:
请帮小蓝计算一下,一共有多少种不同的方案。
题解:
基础dfs,递归回溯,依次将每格作为蛇头深搜最后得到的就是总方案。
#include<iostream>
typedef long long ll;
using namespace std;
ll ans=0;
int nx[4]={1,0,-1,0};
int ny[4]={0,1,0,-1};
int vis[5][5]={0};
void dfs(int x,int y,int step)
{
if(x<1||x>4||y<1||y>4)return ;
if(step==16)
{
ans++;
return ;
}
for(int i=0;i<4;i++)
{
int xx=x+nx[i];
int yy=y+ny[i];
if(vis[xx][yy]!=1)
{
vis[xx][yy]=1;
dfs(xx,yy,step+1);
vis[xx][yy]=0;
}
}
}
int main()
{
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
vis[i][j]=1;
dfs(i,j,1);
vis[i][j]=0;
}
}
cout<<ans<<endl;
return 0;
}
运行结果:552