题目描述:
题解:
//玩具蛇
//为什么不用判断,因为都不一样
#include <bits/stdc++.h>
using namespace std;
int maze[5][5]; //0表示可以走,1表示不可以走
char temp[5][5]; //临时矩阵,判断是否与之前的有相同的--或许没有必要
int pos=1; //表示已经安排的节数
int ans=0; //表示最后的结果
const int dirx[4]={0,0,1,-1};
const int diry[4]={1,-1,0,0}; //右左下上的方式
//判断下一个点是否可行
bool isok(int tox,int toy)
{
if((tox>0 && tox<=4) && (toy>0 && toy<=4) && (maze[tox][toy]==0))
return true;
return false;
}
//深度优先搜索--解决玩具蛇问题
void dfs2(int x,int y,int pos) //是开始的坐标值
{
//还得剪枝操作
if(pos==16) //把第一个点确定以后,pos的值是1,把第十六个点确定以后,值改为16
{
ans++; //加一次方式
return ;
}
//正式开始往下走
for(int m=0;m<4;++m)
{
int tox = x + dirx[m];
int toy = y + diry[m];
//判断下一个点
if(isok(tox,toy))
{
//把下一个点标记
maze[tox][toy]=1;
//继续深搜下一个
dfs2(tox,toy,pos+1);
maze[tox][toy]=0; //恢复现场
}
}
}
int main(){
//我觉着应该是从第一个结点开始尝试
for(int i=1;i<=4;++i)
{
for(int j=1;j<=4;++j)
{
//每一次开始都初始化
//将这个点置为1不可走状态
maze[i][j]=1; //表示已经安排的个数了
dfs2(i,j,pos); //从这个节点开始,遍历所有的,pos算是第一节
maze[i][j]=0;
}
}
cout<<ans<<endl;
return 0;
}
小小记录一下