深度优先搜索

全排列,假如有编号为1,2,3的3张扑克牌和编号为1,2,3的三个盒子。现在需要将3张扑克牌分别放在3个盒子里面,并且每个盒子有且只能放一张扑克牌,问题是一共有多少种放法?

如下:

小明拿三张扑克牌走到一号盒子面前,他的心里想1,2,3放哪一个呢?如果要生成全排列,那么都要尝试,于是他先放1,走到2后放下2,最后在3号盒子中放下3,生成排列1,2,3。可是这并没有结束,生成一种排列后,小明需要立即返回,现在小明到了3号盒子面前,取回三号盒子的扑克牌,当小明发现手中只有三号扑克牌的时候,没有其他选择,于是小明不得不再往后退一步,回到2号盒子面前,收回2号盒子中的扑克牌,现在小明有两张扑克牌了,分别是2号和3号,按照之前的规定接下来就是往2号盒子中放下3号扑克牌,往3号盒子中放下2号扑克牌。之后的顺序就是这样,最终每个盒子都能够遍历完所有的扑克牌。

输入:5 4

0 0 1 0

0 0 0 0

0 0 1 0

0 1 0 0

0 0 0 1

1 1 4 3

运行结果: 7

样例说明:输入第一个数n表示迷宫的行,m表示迷宫的列,接下来n行m列为迷宫,0表示空地,1表示障碍物,最后一行四个数前两个表示入口,后两个表示出口,输出最短的步长。

# include <iostream>
# include <string.h>
using namespace std;
int n,m,end_x,end_y,flag=111111;
int a[101][101],b[101][101];
int guiji[4][2]={{0,1},{0,-1},{-1,0},{1,0}}; 
void find(int x,int y,int step){    
    if(x==end_x&&y==end_y){
        if(step<flag){
            flag=step;
        }
        return ;
    } 
    for(int i=0;i<=3;i++){
    int xx=x+guiji[i][0];
    int yy=y+guiji[i][1];
    if(xx<1||xx>n||yy<1||yy>m)
    continue;
    if(a[xx][yy]==0){
        a[xx][yy]=1;
        find(xx,yy,step+1);
        a[xx][yy]=0;
    }
    }
    return ;    
}
 
int main(){
    memset(b,0,sizeof(b));
    freopen("xx.txt","r",stdin);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    int begin_x,begin_y;
    cin>>begin_x>>begin_y;
    cin>>end_x>>end_y;
    find(begin_x,begin_y,0);
    cout<<flag<<endl;
    return 0;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值