迷宫问题c语言广度搜索,迷宫问题Maze (BFS) 广度优先遍历 C语言

給你一個迷宮,

S為起點,E為終點。

請你找出走出迷宮所需要花費的最短步數。

你只能往上下左右四個方向移動。

输入格式:

第一行有一個數字T,代表有T組測資。

每組測資的第一行有兩個數字R、C,

代表迷宮的大小(R x C)。

接下來R行,每行有C個字元來描述迷宮,

'.'代表可以行走的路,

'X'代表不可行走的牆壁,

'S'代表起點,

'E'代表終點。

測資範圍:

T < 100

2 < R,C <= 30

输出要求:

對於每組測資,計算由起點到達終點的最少步數。

測資保證一定存在至少一條由起點通往終點的路徑。

將每組測資的步數加總後再輸出。

输入样例:

2

5 5

SXXXX

...XX

.X...

..XXX

....E

6 6

......

.S..X.

XXX...

....X.

.X..XX

.EX...

输出样例:

18

时间限制:500ms内存限制:32000kb

代码:

#include

#include

#define R 30

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

struct _node{

int level;

int x;

int y;

struct _node* next;

};

typedef struct _node Node;

struct _queue{

Node* head;

Node* tail;

int size;

};

typedef struct _queue Queue;

void enQueue(Queue* que, int x,int y, int level)

{

Node* p;

p = (Node*)malloc(sizeof(Node));

p->x = x;

p->y = y;

p->level = level;

p->next = NULL;

if(que->size==0)

{

que->head = p;

que->tail = p;

}

else

{

que->tail->next=p;

que->tail = p;

}

que->size+=1;

}

int short_path(char* array, int start_x, int start_y, int row, int col)

{

Node *head,*tail,*p,*target;

int x,y, level,i,j;

char chr;

int flag[row][col];

for(i=0;i

{

for(j=0;j

{

flag[i][j]=0;

}

}

flag[start_x][start_y]=1;

Queue que;

que.head = NULL;

que.tail = NULL;

que.size = 0;

enQueue(&que, start_x, start_y, 0);

while(que.size>0)

{

//deqQueue

target = que.head;

x = target->x;

y = target->y;

level = target->level;

que.head = target->next;

que.size -= 1;

//chr = *(array+x*col+y);

//printf("deQueue x= %d, y= %d, level= %d\n",x,y,level);

free(target);

// left

if((y-1>=0) && (y

{

chr = *(array+x*col+y-1);

//printf("explored left %c, x= %d, y= %d, level= %d\n", chr, x,y-1, level+1);

flag[x][y-1]=1;

if(chr=='.')

{

//printf("enqueue x= %d, y= %d, level= %d\n",x,y-1,level+1);

enQueue(&que, x,y-1,level+1);

}

else

if(chr=='E') return level+1;

}

// right

if((y+1

=0) && (flag[x][y+1]==0))

{

chr = *(array+x*col+y+1);

//printf("explored right %c, x= %d, y= %d, level= %d\n", chr, x,y+1, level+1);

flag[x][y+1]=1;

if(chr=='.')

{

//printf("enqueue x= %d, y= %d, level= %d\n",x,y+1,level+1);

enQueue(&que, x,y+1,level+1);

}

else

if(chr=='E') return level+1;

}

// up

if(x-1>=0 && x

{

chr = *(array+(x-1)*col+y);

//printf("explored up %c, x= %d, y= %d, level= %d\n", chr, x-1,y, level+1);

flag[x-1][y]=1;

if(chr=='.')

{

//printf("enqueue x= %d, y= %d, level= %d\n",x-1,y,level+1);

enQueue(&que, x-1,y,level+1);

}

else

if(chr=='E') return level+1;

}

// down

if(x+1=0 && (flag[x+1][y]==0))

{

chr = *(array+(x+1)*col+y);

//printf("explored down %c, x= %d, y= %d, level= %d\n", chr, x+1,y, level+1);

flag[x+1][y]=1;

if(chr=='.')

{

//printf("enqueue x= %d, y= %d, level= %d\n",x+1,y,level+1);

enQueue(&que, x+1,y,level+1);

}

else

if(chr=='E') return level+1;

}

}

return -1;

}

int main() {

int m,n,i,j,strt_x,strt_y,test_num,k,sum=0;

scanf("%d",&test_num);

for(k=0;k

{

scanf("%d %d\n",&m,&n);

char array[m][n];

for(i=0;i

{

gets(array[i]);

for(j=0;j

{

if(array[i][j]=='S')

{

strt_x=i;

strt_y=j;

}

}

}

sum += short_path((char*)array, strt_x, strt_y, m, n);

}

/*

array[0][0]='.';array[0][1]='.'; array[0][2]='.';array[0][3]='.';array[0][4]='.';array[0][5]='.';

array[1][0]='.';array[1][1]='S'; array[1][2]='.';array[1][3]='.';array[1][4]='X';array[1][5]='.';

array[2][0]='X';array[2][1]='X'; array[2][2]='X';array[2][3]='.';array[2][4]='.';array[2][5]='.';

array[3][0]='.';array[3][1]='.'; array[3][2]='.';array[3][3]='.';array[3][4]='X';array[3][5]='.';

array[4][0]='.';array[4][1]='X'; array[4][2]='.';array[4][3]='.';array[4][4]='X';array[4][5]='X';

array[5][0]='.';array[5][1]='E'; array[5][2]='X';array[5][3]='.';array[5][4]='.';array[5][5]='.';

strt_x = 1;

strt_y = 1;

*/

/*

*/

//

//printf("x: %d, y= %d\n", strt_x, strt_y);

printf("%d",sum);

/*

for(i=0;i

{

printf("%c %c %c %c %c\n",array[i][0],array[i][1],array[i][2],array[i][3],array[i][4]);

}*/

return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值