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

迷宫问题Maze




题目内容:

給你一個迷宮,

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;i0)
	{
		//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=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=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



你可能感兴趣的:(algorithm)