dfs问题,总结有一些需要注意的地方。
题目链接:3.玩具蛇 - 蓝桥云课 (lanqiao.cn)
遍历回溯问题,对临时变量的使用。
//本质求填满格子的方式
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int dx[]= {1,-1,0,0};
const int dy[]= {0,0,1,-1};
ll sum=0;
int a[4][4];
void dfs(int x,int y,int cur)
{
if(cur==15)
{
sum++;
return;
}
a[x][y]=1;
for(int i=0; i<4; i++) //遍历过程
{
int nx=x+dx[i];//***必须为临时变量,不然下次回溯时起始位置变化导致后续回溯
int ny=y+dy[i];
if(nx>=0&&nx<=3&&ny>=0&&ny<=3&&!a[nx][ny])
{
dfs(nx,ny,cur+1);
}
}
a[x][y]=0;//走完一条路再开始回溯
}
int main()
{
memset(a,0,sizeof(a));
for(int i=0; i<4; i++) //起始位置可以多个
{
for(int j=0; j<4; j++)
{
dfs(i,j,0);
}
}
cout<<sum<<endl;
return 0;
}
一些小小的改动,得首先确定第一个位置是否已访问,从而改变回溯过程。
//本质求填满格子的方式
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int dx[]= {1,-1,0,0};
const int dy[]= {0,0,1,-1};
ll sum=0;
int a[4][4];
void dfs(int x,int y,int cur)
{
if(cur==15)
{
sum++;
return;
}
for(int i=0; i<4; i++) //遍历过程
{
int nx=x+dx[i];//***必须为临时变量,不然下次回溯时起始位置变化导致后续回溯
int ny=y+dy[i];
if(nx>=0&&nx<=3&&ny>=0&&ny<=3&&!a[nx][ny])
{
a[x][y]=1;
dfs(nx,ny,cur+1);
a[x][y]=0;//走完一条路再开始回溯
}
}
}
int main()
{
memset(a,0,sizeof(a));
for(int i=0; i<4; i++) //起始位置可以多个
{
for(int j=0; j<4; j++)
{
a[i][j]=1;
dfs(i,j,0);
a[i][j]=0;
}
}
cout<<sum<<endl;
return 0;
}