C基础:堆栈性质应用深度搜索

转载请注明出处:http://blog.csdn.net/droyon/article/details/9840619

堆栈性质:先进后出

先进后出的特点,让堆栈具备了深度优先的特点。

如下图:红色数字组成了5x5的方阵,我们要沿着值为0的位置进行搜索,值为1的位置不可跨越。

操作:

1、将方阵加入堆栈。2、从左上角进入,检查四周可以行走的位置(值为0,可行走)3、打印行走路线图(图中标出了步数)


由于堆栈先进后出的性质,在搜索路线行走时,他会优先沿着一个方向“深度”进行下去。

测试例子:

#include<stdio.h>

#define MAX_ROW 5
#define MAX_COL 5

int curIndex = 0;

struct point{
    int x,y;
}move_stack[512];

int maze[MAX_ROW][MAX_COL] = {
    {0, 1, 0, 0, 0},
    {0, 1, 0, 1, 0},
    {0, 0, 0, 0, 0},
    {0, 1, 1, 1, 0},
    {0, 0, 0, 1, 0},
};

void print_maze(){
    int i = 0,j=0;
    printf("第%d次操作结果**************************\n",++curIndex);
    for(i=0;i<MAX_ROW;i++){
        for(j=0;j<MAX_COL;j++){
            if(maze[i][j] == 0){
                printf("%c\t",'#');
            }else if(maze[i][j] == 2){
                printf("%s\t","<0>");
            }else{
                printf("%c\t",'|');
            }
        }
        printf("\n");
    }
    printf("**********************************\n");
} 

void print_maze_value(){
    int i=0,j=0;
    for(i=0;i<MAX_ROW;i++){
        for(j=0;j<MAX_COL;j++){
            printf("%d \t",maze[i][j]);
        }
        printf("\n");
    }
}

int top =0;
void push(struct point p){
    move_stack[top] = p;
    top++;
}

struct point pop(){
    top--;
    return move_stack[top];
}

int isEmpty(){
    return top == 0;
}

void visit(int row,int col){
    maze[row][col] = 2;
    struct point visit_point = {row,col};
    push(visit_point);
    print_maze();
}


int main(void){
    struct point p = {0,0};
    maze[0][0] = 2;
    push(p);
    while(!isEmpty()){
        p = pop();
        //printf("p.x : %d,p.y : %d\n",p.x,p.y);
        if(p.x ==MAX_ROW-1 && p.y == MAX_COL-1){
            continue;
        }
        if(p.x+1<MAX_ROW&&maze[p.x+1][p.y]==0){
            visit(p.x+1,p.y);
        }
        if(p.x-1>-1&&maze[p.x-1][p.y] == 0){
            visit(p.x-1,p.y);
        }
        if(p.y+1<MAX_COL&&maze[p.x][p.y+1]==0){
            visit(p.x,p.y+1);
        }
        if(p.y-1>-1&&maze[p.x][p.y-1]==0){
            visit(p.x,p.y-1);
        }
    }

    return 0;
}

打印:

第1次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
#	#	#	#	#	
#	|	|	|	#	
#	#	#	|	#	
**********************************
第2次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	#	#	#	#	
#	|	|	|	#	
#	#	#	|	#	
**********************************
第3次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	#	#	#	#	
<0>	|	|	|	#	
#	#	#	|	#	
**********************************
第4次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	<0>	#	#	#	
<0>	|	|	|	#	
#	#	#	|	#	
**********************************
第5次操作结果**************************
<0>	|	#	#	#	
<0>	|	#	|	#	
<0>	<0>	<0>	#	#	
<0>	|	|	|	#	
#	#	#	|	#	
**********************************
第6次操作结果**************************
<0>	|	#	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	#	#	
<0>	|	|	|	#	
#	#	#	|	#	
**********************************
第7次操作结果**************************
<0>	|	#	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	#	
<0>	|	|	|	#	
#	#	#	|	#	
**********************************
第8次操作结果**************************
<0>	|	#	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	#	
#	#	#	|	#	
**********************************
第9次操作结果**************************
<0>	|	#	#	#	
<0>	|	<0>	|	#	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
#	#	#	|	#	
**********************************
第10次操作结果**************************
<0>	|	#	#	#	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
#	#	#	|	#	
**********************************
第11次操作结果**************************
<0>	|	#	#	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
#	#	#	|	#	
**********************************
第12次操作结果**************************
<0>	|	#	<0>	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
#	#	#	|	#	
**********************************
第13次操作结果**************************
<0>	|	<0>	<0>	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
#	#	#	|	#	
**********************************
第14次操作结果**************************
<0>	|	<0>	<0>	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
#	#	#	|	<0>	
**********************************
第15次操作结果**************************
<0>	|	<0>	<0>	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
<0>	#	#	|	<0>	
**********************************
第16次操作结果**************************
<0>	|	<0>	<0>	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
<0>	<0>	#	|	<0>	
**********************************
第17次操作结果**************************
<0>	|	<0>	<0>	<0>	
<0>	|	<0>	|	<0>	
<0>	<0>	<0>	<0>	<0>	
<0>	|	|	|	<0>	
<0>	<0>	<0>	|	<0>	
**********************************

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hailushijie

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值