voiddfs(int step){判断边界尝试每一种可能for(int i=1;i<=n;i++){继续下一步dfs(step+1);}return;}#include<stdio.h>int a[10],book[10],n;//C语言的全局变量在没有赋值前默认为0,所以数组不用赋值了voiddfs(int step)//step表示站在第几个盒子面前{int i;if(step==(n+1))//表示前面n 个盒子已经安排好了{//输出一种排列,(1-n盒子中的扑克牌编号)for(int i =1; i <= n; i++){printf("-%d",a[i]);}printf("\r\n");return;//返回之前一步,也即最近调用dfs函数的地方}//此时站在第step个盒子面前,应该放那张牌呢?//按照 1-2-3-4-----n的顺序一一尝试for(int i =1; i <= n; i++){if(book[i]==0)//如果扑克i还在手上{//开始 常识使用扑克ia[step]=i;//将扑克i放入第step个盒子中book[i]=1;//表示扑克i已经不在手中//第step个盒子已经放好扑克牌,接下来需要走到下一个盒子面前dfs(step+1);//通过函数的递归调用来实现book[i]=0;//将刚才常识的扑克牌收回,才能进行下一次的常识}}return;}intmain(int argc,charconst*argv[]){printf("Input a int num between 0-9:\r\n");scanf("%d",&n);dfs(1);//首先站到第一个盒子面前return0;}
#include<stdio.h>int m,n,q,p,min=999999;int a[51][51],book[51][51];voiddfs(int x,int y,int step){int next[4][2]={//这里的x和y代表的是行和列,{0,1},//向右走**也即行不变,列+1{1,0},//向下走**列不变,行+1{0,-1},//向左走**行不变,列-1{-1,0}//向上走**行-1,列不变};int tx,ty,k;//判断是否到达小哈的位置if(x==p && y==q){if(step<min)min=step;return;}//枚举四种走法,方向为右、下、左、上for(k =0; k <=3; k++){//计算下一个点的坐标/*当k=0时,tx=x+0;ty=y+1;*当k=1时,tx=x+1;ty=y+0;*当k=2时,tx=x+0;ty=y-1;*当k=3时,tx=x-1;ty=y+0;*/tx=x+next[k][0];ty=y+next[k][1];//判断是否越界if(tx<1||ty<1||tx>n||ty>m){continue;//下面的代码不执行,重新回归继续for循环}//判断该点是否为障碍物或者已经在路径之中if(a[tx][ty]==0&& book[tx][ty]==0)//如果该点,也就是计算出来的下一个点,既不是障碍物又不在已走过的路径中{book[tx][ty]=1;//标记该点已经走过dfs(tx,ty,step+1);//开始尝试下一个点,尝试每一种可能book[tx][ty]=0;//尝试结束, 取消这个点的标记}}return;}intmain(int argc,charconst*argv[]){int i,j,startx,starty;//读入迷宫的行和列,n为行,m为列printf("Input the map size:\r\n");scanf("%d %d",&n,&m);//读取迷宫for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%d",&a[i][j]);//二维数组a用来保存地图}}//读入迷宫的起点和终点printf("Input the start and the ending:\r\n");scanf("%d %d %d %d",&startx,&starty,&p,&q);//从起点开始搜索 book[startx][starty]=1;//标记起点已经在路径中,防止重复走----二维数组book用来存储已经走过的点dfs(startx,starty,0);//从起点开始,走过的路程为0printf("The min length is: %d\r\n",min);return0;}