Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

数组模拟队列,详细注释

Posted by 110120_119 at 2019-04-04 15:25:49 on Problem 3984
#include<cstdio>
#pragma warning (disable:4996)
using namespace std;

int map[5][5];					//用来存储地图
int visit[5][5];				//用来标记每个坐标是否访问过
int direction[4][2] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };			//控制上右下左
int lastIndex;					//队列中最后一个状态的下标

struct Node						//存储每个节点
{
	int x, y;					//坐标
	int fatherIndex;			//当前节点的上一个节点在队列中的下标,方便回溯
}queue[20];

void bfs()
{
	Node now, next;										//当前状态
	int head = 0, tail = 1;								//队列头尾指针
	now.x = 0;	now.y = 0;	now.fatherIndex = 0;		//初始化状态
	visit[0][0] = 1;									//要记得将起点标记为已访问
	queue[0] = now;										//初始状态入队

	while (head < tail)									//只要队列不为空
	{
		now = queue[head];								//队列头出队
		head++;											//头指针后移一个
			
		for (int i = 0; i < 4; i++)						//四个方向尝试,将可能到达的下一个节点都加入队列
		{
			int dx = now.x + direction[i][0];			//下一个节点的坐标
			int dy = now.y + direction[i][1];
			
			if ((0 <= dx && dx < 5) && (0 <= dy && dy < 5) && (map[dx][dy] == 0) && (visit[dx][dy] == 0))	//在不越界的前提下,下一个节点可走且未被访问过,则加入队列
			{
				visit[dx][dy] = 1;						//标记已访问

				next.x = dx;							//更新下一个节点的坐标
				next.y = dy;
				next.fatherIndex = head - 1;			//前一个节点在队列中的位置就是出队元素的下标,也就是头指针所指的前一个
				
				//printf("(%d,%d)--->(%d,%d)   fatherIndex=%d\n", now.x, now.y, next.x, next.y, next.fatherIndex);

				queue[tail] = next;						//下一个节点入队
				tail++;									//队尾后移一个

				if ((next.x == 4) && (next.y == 4))		//若下一个节点是终点
				{
					lastIndex = tail - 1;				//记录最后一个节点在队列中的下标
					//printf("lastIndex=%d\n", lastIndex);
					return;								//直接结束bfs
				}	
			}
		}
	}
}

int main()
{
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			scanf("%d", &map[i][j]);		//读取地图,并清空状态数组
			visit[i][j] = 0;
		}
	}

	bfs();

	int trace_x[20], trace_y[20];			//记录横坐标、纵坐标
	int count = 0;
	

	for (int index = lastIndex; index > 0;)		//由最后一个Node往前找,第一个的下标在数组中一定是第一个
	{
		trace_x[count] = queue[queue[index].fatherIndex].x;
		trace_y[count] = queue[queue[index].fatherIndex].y;
		//printf("(%d,%d)\n", trace_x[count], trace_y[count]);
		count++;
		index = queue[index].fatherIndex;		//不断更新当前节点在队列中的下标,回溯上一个节点
	}
	
	for (int i = count - 1; i >= 0; --i)
	{
		printf("(%d, %d)\n", trace_x[i], trace_y[i]);
	}
	printf("(4, 4)\n");

	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator