马拦过河卒的暴搜过程

15 篇文章 0 订阅
3 篇文章 0 订阅
图片来自于洛谷

洛谷
洛谷
暴力搜索过程可以类比为以下九宫格的搜索过程:

第一次搜索过程:
在这里插入图片描述
由于在前面的递归函数为向右搜索的,所以先一直调用向右搜索的过程,直到搜索超出右边的范围,return;表示递归过程结束,将函数控制权放回到上一次递归函数处,继续按顺序执行函数,所以将会执行到下一个递归函数,既向下搜索的过程,然后在进入函数的过程中,由于向右搜索的函数在向下搜索的函数上面,所以还是先判断是否能向右搜索,向右搜索会越界,函数控制权返回到上一次控制向右搜索的位置,继续顺序执行函数,然后以此类推,最终到达目的地;
注解: 如果搜索的下一个位置为马拦位置,那么将控制权返回到上一个控制搜索的函数处,按顺序执行函数的下一个语句,这里有一个值得思考的问题:返回后还会不会再重新到达这里,执行已经执行过的操作,从而造成一个死循环?不会,因为在函数进行回溯的过程中,每当回溯一次,都会将函数的控制权返回到控制该次搜索的函数位置,按照函数的从上到下的执行顺序,继续执行下一方向的递归操作,注意!回溯过后将会执行下一个方向的递归函数,所以一定不会反复的执行这一句,最终造成死循环。递归函数的内部原理

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 100;
int a[N][N];
int c;
int n,m,x,y;
void dfs(int x, int y){
    if(x == n && y == m){
        c ++ ;
        return;
    }
    if(x > n || y > m || a[x][y] == 1) return;
    if(!a[x + 1][y])dfs(x + 1, y);
    if(!a[x][y + 1])dfs(x, y + 1);
}
int main(){
    scanf("%d%d%d%d",&n,&m,&x,&y);
    a[x][y]=1;
    a[x-1][y-2]=1;
    a[x-2][y-1]=1;
    a[x+1][y+2]=1;
    a[x+2][y+1]=1;
    a[x-2][y+1]=1;
    a[x-1][y+2]=1;
    a[x+1][y-2]=1;
    a[x+2][y-1]=1;
    c=0;
    dfs(0,0);
    printf("%d\n",c);
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值