问题描述
小蓝有一条玩具蛇,一共有 16 节,上面标着数字 1 至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角。小蓝还有一个 4 × 4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A 到 P 共 16 个字母。小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。
dfs
通过dfs向四个方向查找
#include<iostream>
#include<cstring>
using namespace std;
int a[4][4];
int next[4][2] ={{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int res;
void dfs(int x,int y,int step){
if(step == 16){
res ++;
return;
}
for(int i = 0; i < 4; i ++){
int tx = x + next[i][0], ty = y + next[i][1];
if(tx >= 0 && tx <= 3 && ty >= 0 && ty <= 3 && a[tx][ty] == 0){
a[tx][ty] = 1;
dfs(tx, ty, step + 1);
a[tx][ty] = 0;
}
}
}
int main(){
for(int i = 0; i < 4; i ++){
for(int j = 0; j < 4; j ++){
a[i][j] = 1;
dfs(i, j, 1);
a[i][j] = 0;
}
}
cout << res << endl;
system("pause");
return 0;
}