您的位置:首页 > 其它

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

2013-08-08 19:30 435 查看
转载请注明出处: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>
**********************************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息