前言:
dfs能水很多分,aj让我练习sb DFS 阿这
T1:骑士游历
思路:
判断有没有超过边界,没有的话就搜,然后累计一下方案数
C o d e Code Code:
#include <cstdio>
#include <iostream>
using namespace std;
int ans,n,m;
int dx[5] = {
0,2,1,-1,-2};
int dy[5] = {
0,1,2,2,1};
void dfs (int xx,int yy)
{
if (xx == n && yy == m)//终点
{
ans++;
return;
}
for (int i = 1; i <= 4; ++i)
{
if (xx + dx[i] > 0 && xx + dx[i] <= n && yy + dy[i] > 0 && yy + dy[i] <= m)//判断越界没
dfs(xx + dx[i],yy + dy[i]);//搜
}
}
int main ()
{
scanf("%d%d", &n, &m);
dfs(1,1);//从(1,1)开始搜
printf("%d",ans);
}
T2:迷宫问题
思路:
这题也很简单,和上题相比就多了个回溯
C o d e Code Code:
#include <cstdio>
#include <iostream>
using namespace std;
const int dx[9] = {
0,0,-1,-1,-1,0,1,1,1};
const int dy[9] = {
0,-1,-1,0,1,1,1,0,-1};
int ans,n,a[100][100];
void dfs (int x, int y)
{
if (x == 1 && y == n)
{
ans++;
return;
}
for (int i = 1; i <= 8; ++i)
{
if(x + dx[i] > 0 && x + dx[i] <= n && y + dy[i] <= n && y +dy[i] > 0)
if (a[x + dx[i]][y + dy[i]] == 0 )
{
a[x + dx[i]][y + dy[i]] = 1;
dfs(x + dx[i],y + dy[i]);
a[x + dx[i]][y + dy[i]] = 0;
}
}
}
int main ()
{
scanf("%d",&n);
for (int i = 1; i <&