poj 2415(BFS)
生活随笔
收集整理的這篇文章主要介紹了
poj 2415(BFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
與50位技術專家面對面20年技術見證,附贈技術全景圖
題意:?有一種游戲,共有三個piece(不妨稱為棋子),棋盤是由N個點構成的完全圖,邊有顏色。每次可以移動一個棋子,移動時必須滿足棋子走過的邊的顏色和其他兩個棋子之間的連邊的顏色一致。求把三個棋子移到同一個頂點的最少次數。
這道題是一個很簡單的BFS,但為何一直TLE。。。。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std;const int maxn = 55; struct node {int pos[4];int move; }; int n,p1,p2,p3; char map[maxn][maxn]; bool vis[maxn][maxn][maxn];int bfs() {queue<node> q;node cur,nxt;cur.move = 0;cur.pos[1] = p1; cur.pos[2] = p2; cur.pos[3] = p3;q.push(cur);while(!q.empty()){cur = q.front();q.pop();if(cur.pos[1] == cur.pos[2] && cur.pos[2] == cur.pos[3]) return cur.move;for(int i = 1; i <= 3; i++)for(int j = 1; j <= n; j++){nxt.pos[1] = cur.pos[1]; nxt.pos[2] = cur.pos[2]; nxt.pos[3] = cur.pos[3];if(i == 1 && map[cur.pos[1]][j] == map[cur.pos[2]][cur.pos[3]]){if(vis[j][cur.pos[2]][cur.pos[3]] == true) continue;vis[j][cur.pos[2]][cur.pos[3]] == true;cur.pos[1] = j;nxt.move = cur.move + 1;q.push(nxt);}else if(i == 2 && map[cur.pos[2]][j] == map[cur.pos[1]][cur.pos[3]]){if(vis[cur.pos[1]][j][cur.pos[3]] == true) continue;vis[cur.pos[1]][j][cur.pos[3]] = true;cur.pos[2] = j;nxt.move = cur.move + 1;q.push(nxt);}else if(i == 3 && map[cur.pos[3]][j] == map[cur.pos[1]][cur.pos[2]]){if(vis[cur.pos[1]][cur.pos[2]][j] == true) continue;vis[cur.pos[1]][cur.pos[2]][j] = true;cur.pos[3] = j;nxt.move = cur.move + 1;q.push(nxt);}}}return -1; }int main() {while(scanf("%d",&n) != EOF && n){scanf("%d%d%d",&p1,&p2,&p3);for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){getchar();scanf("%c",&map[i][j]);}}memset(vis,false,sizeof(vis));int ans = bfs();if(ans == -1) printf("impossible\n");else printf("%d\n",ans);}return 0; }
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的poj 2415(BFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: poj 1324(BFS+状态压缩)
- 下一篇: 【spring】通过GZIP压缩提高网络