笨笨熊要搬家,它现在的家在B点,新的豪宅在H点,现在要从B点到H点
地图R表示行,C表示列,其中:
-表示能通过
#表示不能通过
B表示笨笨熊原来的家
H表示笨笨熊的新豪宅
输入
R
C
R×C矩阵
输出
Y//表示可以通过
N//表示不可以通过
#include <iostream> #include <queue> using namespace std; //Point in the grid typedef struct { int x; int y; }Pos; //record the BSF progress , then go back to find the right road typedef struct { Pos curpoint; int prepoint_pos;//previous in records (parent node) }Record; //记录遍历节点 int record_len = 0; int dequeue_count = -1;//出队列的节点在记录数组中的位置 // const int M = 5; const int N = 4; char grid[M][N] = { '-','-','-','-', 'B','-','#','H', '-','-','#','-', '-','-','#','-', '#','-','-','-', }; Record BFS_Record[M*N];// //其目的是为了在找到出口后沿这个下标返回到入口处,方便最后显示这条最短路径。 queue<Pos> roadqueue; bool map[M][N] = {false}; Pos GetDataPos(char c); bool IsHome(Pos pos,char c); int EnqueueAdjacentPos(Pos pos); int VisitAndPush(int i,int j); int main() { Pos beg; bool flag = false; cout << "***当前地图***" << endl; for(int m = 0;m<M;m++) { for(int n = 0;n<N;n++) cout << grid[m][n]; cout<< endl; } beg = GetDataPos('B'); roadqueue.push(beg); //有元素入队列 就记录 遍历节点与父节点的信息 BFS_Record[record_len].curpoint = beg; BFS_Record[record_len].prepoint_pos = dequeue_count; //cout << "record_len:" << record_len << endl; record_len ++; // int i = beg.x, j = beg.y;//may existed non-conncted graph cout << "*****能否从B到达H*****" << endl; if(!map[i][j]) { //cout << "(" << i << "," << j << "): " << grid[i][j] << endl;//visit map[i][j] = true; while(!roadqueue.empty()) { Pos tmp = roadqueue.front(); dequeue_count++;//又一个元素出队列 roadqueue.pop(); if(EnqueueAdjacentPos(tmp))// right down left up { cout << "YES" << endl; flag = true; break; } } } if(!flag) cout << "NO" << endl;//roadqueue is empty , but still not reach the pos with 'H' //end = GetDataPos('H'); cout << endl << "****记录遍历的坐标点*******************************" << endl; cout << grid[ BFS_Record[0].curpoint.x ][ BFS_Record[0].curpoint.y ] << endl; for(i = 0;i<record_len;i++) { cout << "[" << i << "]:" << "(" << BFS_Record[i].curpoint.x << "," << BFS_Record[i].curpoint.y << ") " << BFS_Record[i].prepoint_pos << endl; } cout << grid[ BFS_Record[record_len - 1].curpoint.x ][ BFS_Record[record_len - 1].curpoint.y ] << endl; cout << endl << "******H<--B的一条最短路径******" << endl << endl; for(i = record_len - 1;i>0;) { cout << "(" << BFS_Record[i].curpoint.x << "," << BFS_Record[i].curpoint.y << ")"; cout << "<--"; i = BFS_Record[i].prepoint_pos; } cout << "(" << BFS_Record[i].curpoint.x << "," << BFS_Record[i].curpoint.y << ")"; cout << endl << endl; return 0; } Pos GetDataPos(char c) { Pos tmp; tmp.x = tmp.y = -1; for(int i = 0;i<M;i++) for(int j = 0;j<N;j++) if(grid[i][j] == c) { tmp.x = i; tmp.y = j; return tmp; } return tmp; } bool IsHome(Pos pos,char c) { if(grid[pos.x][pos.y] == c) return true; else return false; } int EnqueueAdjacentPos(Pos cur_pos) {/* right down left up */ int cur_x = cur_pos.x,cur_y = cur_pos.y; int i,j; //has right pos if(cur_y >=0 && cur_y < N-1) { i = cur_x; j = cur_y + 1; if(VisitAndPush(i,j)) return 1; } //has down pos if(cur_x >=0 &&cur_x < M-1) { i = cur_x +1; j = cur_y; if(VisitAndPush(i,j)) return 1; } //has left pos if(cur_y > 0 && cur_y < M) { i = cur_x; j = cur_y -1; if(VisitAndPush(i,j)) return 1; } //has up pos if(cur_x > 0 && cur_x < M) { i = cur_x - 1; j = cur_y; if(VisitAndPush(i,j)) return 1; } return 0; } int VisitAndPush(int i,int j) { Pos tmp; if(!map[i][j] && grid[i][j] != '#')//*****unvisited and available pos ( - , H) { map[i][j] = true; tmp.x = i; tmp.y = j; //有元素入队列 就记录 遍历节点与父节点的信息 BFS_Record[record_len].curpoint = tmp; BFS_Record[record_len].prepoint_pos =dequeue_count; //cout << "record_len:" << record_len << endl; record_len ++; // roadqueue.push(tmp); if(grid[i][j] == 'H')//arrive the end pos [最后一个结点H进入队列 算法终止] return 1; } return 0; }
原文地址:http://blog.csdn.net/hishentan/article/details/38906777