Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:数组模拟队列,详细注释In Reply To:数组模拟队列,详细注释 Posted by:110120_119 at 2019-04-04 15:25:49 > #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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator