C++笔记-二维棋盘数组使用BFS(宽度优先遍历)
生活随笔
收集整理的這篇文章主要介紹了
C++笔记-二维棋盘数组使用BFS(宽度优先遍历)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這里只對一個頂點只能上下左右,不能和左上,左下,右上,右下連起來。
思路步驟:
1.二維棋盤數據轉鏈接表;
2.鄰接表直接進行BFS
源碼如下:
#include <QDebug> #include <QVector> #include <QQueue>#define MAX_COLUMN 6 + 2 #define MAX_ROW 6 + 2//用-1包住,保證處理的統一 int map1[MAX_ROW][MAX_COLUMN] = {-1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, 1, -1,-1, -1, -1, -1, -1, -1, 0, -1,-1, -1, -1, -1, -1, -1, 0, -1,-1, -1, -1, -1, -1, -1, 0, -1,-1, -1, -1, -1, 1, 1, 0, -1,-1, -1, -1, -1, -1, -1, -1, -1 };struct Point{Point(int vNum, int x, int y) {this->vNum = vNum;this->x = x;this->y = y;}int vNum = -1; //頂點號int x; //x軸int y; //y軸friend QDebug operator << (QDebug os, Point &test){os << "(頂點:" << test.vNum << ", x:" << test.x << ", y:" << test.y << ")";return os;} };class Graph {public:Graph(int map[MAX_ROW][MAX_COLUMN]) {memcpy(m_map, map, sizeof(m_map));//不為-1的都是頂點int vCount = 0;for (int i = 0; i < MAX_ROW; i++) {for (int j = 0; j < MAX_COLUMN; j++) {if (map[i][j] != -1) {Point point(vCount++, i, j);QVector<Point> ve;ve.append(point);m_adj.append(ve);}}}if (vCount == 0) {qDebug() << "退出" << endl;exit(-1);}this->m_v = vCount;analysisEdge();}//打印鄰接表void print() {for (int i = 0; i < this->m_v; ++i) {qDebug() << "頂點:" << this->m_adj[i][0].vNum << " x:" << this->m_adj[i][0].x << " y:" << this->m_adj[i][0].y << " 的鄰接表!";for (int j = 0; j < this->m_adj[i].size(); j++) {qDebug() << "頂點:" << this->m_adj[i][j].vNum << " x:" << this->m_adj[i][j].x << " y:" << this->m_adj[i][j].y;}qDebug() << "------------------------------------";}}void bfs(int startV){bool visited[this->m_v];for(int i = 0; i < this->m_v; i++){visited[i] = false;}Point point = getPointByVertex(startV);if(point.vNum == -1){qDebug() << "頂點錯誤!";exit(0);}QQueue<Point> queue;queue.push_back(point);visited[startV] = true;while(!queue.empty()){Point s = queue.front();queue.pop_front();// start todo somethingqDebug() << s;// end todo somethingfor(int i = 0; i < this->m_adj[s.vNum].size(); i++){int curretV = this->m_adj[s.vNum][i].vNum;if(visited[curretV] == false){visited[curretV] = true;queue.push_back(this->m_adj[s.vNum][i]);}}}}protected://通過坐標獲取頂點號Point getPointByPosXAndPosY(int x, int y) {for (int i = 0; i < this->m_v; i++) {if (this->m_adj[i][0].x == x && this->m_adj[i][0].y == y) {return this->m_adj[i][0];}}return Point(-1, -1, -1);}//通過頂點號返回PointPoint getPointByVertex(int v){for(int i = 0; i < this->m_v; i++){if(this->m_adj[i][0].vNum == v){return this->m_adj[i][0];}}return Point(-1, -1, -1);}void analysisEdge() {//分析下邊,這個頂點,如果周圍一圈都是非-1的數,說明都可達。for (int i = 0; i < this->m_v; i++) {//左上 // if (m_map[this->m_adj[i][0].x - 1][this->m_adj[i][0].y - 1] != -1) {// Point point = getPointByPosXAndPosY(this->m_adj[i][0].x - 1, this->m_adj[i][0].y - 1); // if (point.vNum != -1) {// //頂點是從1開始算,但下標是從0開始 // m_adj[this->m_adj[i][0].vNum].push_back(point); // } // }//正上if (m_map[this->m_adj[i][0].x - 1][this->m_adj[i][0].y] != -1) {Point point = getPointByPosXAndPosY(this->m_adj[i][0].x - 1, this->m_adj[i][0].y);if (point.vNum != -1) {//頂點是從1開始算,但下標是從0開始m_adj[this->m_adj[i][0].vNum].push_back(point);}}//右上 // if (m_map[this->m_adj[i][0].x - 1][this->m_adj[i][0].y + 1] != -1) {// Point point = getPointByPosXAndPosY(this->m_adj[i][0].x - 1, this->m_adj[i][0].y + 1); // if (point.vNum != -1) {// //頂點是從1開始算,但下標是從0開始 // m_adj[this->m_adj[i][0].vNum].push_back(point); // } // }//正右if (m_map[this->m_adj[i][0].x][this->m_adj[i][0].y + 1] != -1) {Point point = getPointByPosXAndPosY(this->m_adj[i][0].x, this->m_adj[i][0].y + 1);if (point.vNum != -1) {//頂點是從1開始算,但下標是從0開始m_adj[this->m_adj[i][0].vNum].push_back(point);}}//右下 // if (m_map[this->m_adj[i][0].x + 1][this->m_adj[i][0].y + 1] != -1) {// Point point = getPointByPosXAndPosY(this->m_adj[i][0].x + 1, this->m_adj[i][0].y + 1); // if (point.vNum != -1) {// //頂點是從1開始算,但下標是從0開始 // m_adj[this->m_adj[i][0].vNum].push_back(point); // } // }//正下if (m_map[this->m_adj[i][0].x + 1][this->m_adj[i][0].y] != -1) {Point point = getPointByPosXAndPosY(this->m_adj[i][0].x + 1, this->m_adj[i][0].y);if (point.vNum != -1) {//頂點是從1開始算,但下標是從0開始m_adj[this->m_adj[i][0].vNum].push_back(point);}}//左下 // if (m_map[this->m_adj[i][0].x + 1][this->m_adj[i][0].y - 1] != -1) {// Point point = getPointByPosXAndPosY(this->m_adj[i][0].x + 1, this->m_adj[i][0].y - 1); // if (point.vNum != -1) {// //頂點是從1開始算,但下標是從0開始 // m_adj[this->m_adj[i][0].vNum].push_back(point); // } // }//正左if (m_map[this->m_adj[i][0].x][this->m_adj[i][0].y - 1] != -1) {Point point = getPointByPosXAndPosY(this->m_adj[i][0].x, this->m_adj[i][0].y - 1);if (point.vNum != -1) {//頂點是從1開始算,但下標是從0開始m_adj[this->m_adj[i][0].vNum].push_back(point);}}}}private:int m_v; //頂點的個數int m_map[MAX_ROW][MAX_COLUMN];QVector<QVector<Point>> m_adj; };int main(int argc, char *argv[]) {Q_UNUSED(argc)Q_UNUSED(argv)Graph g(map1);g.print();g.bfs(0);getchar();return 0; }如下二維棋盤:
int map1[MAX_ROW][MAX_COLUMN] = {-1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, 1, -1,-1, -1, -1, -1, -1, -1, 0, -1,-1, -1, -1, -1, -1, -1, 0, -1,-1, -1, -1, -1, -1, -1, 0, -1,-1, -1, -1, -1, 1, 1, 0, -1,-1, -1, -1, -1, -1, -1, -1, -1 };BFS是這樣的(從第1個頂點(下標為0)開始):
總結
以上是生活随笔為你收集整理的C++笔记-二维棋盘数组使用BFS(宽度优先遍历)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web前端笔记-two.js图形旋转动画
- 下一篇: Qt工作笔记-自定义打印及存日志及std