UVA10047

来源:互联网 发布:美萍预算软件 编辑:程序博客网 时间:2024/05/17 08:46

用一个bfs就行了,但和普通的bfs不一样的,普通的bfs条件通常是有 行和列是否访问 ,然后向8个方向拓展;而这题的变量需要有4个,行列,方向,颜色。

但写法和普通的bfs一模一样,就是vis数组成了四维。。而拓展变成了三个,左转,右转,和前进。需要特别注意的是,左转,右转还有前进的时候,哪些变量怎么变,

还有一个细节就是在用0,1,2,3标记四个方向时,左转右转怎么变,每个方向前进时,行列,x,y怎么变;;


Ac代码 :


#include<stdio.h>#include<iostream>#include<string>#include<queue>using namespace std;const int N = 100;int go[4][2] = {{-1,0}, {0,1}, {1,0}, {0,-1}};int bx,by,ex,ey;bool vis[N][N][4][5];string str[N];bool ok;struct bic {int x;int y;int color;int sta;int sec;}bic1,bic2;int res;int n,m;int Case = 1;queue<bic> q;void init() {for (int i = 0 ; i < N ; i++) str[i] = "";for (int i = 0 ; i < N ;i++) {for (int  j = 0 ; j < N ;j++) {for (int k = 0 ; k < 4 ; k++) {for (int l = 0 ;l < 5 ;l++)vis[i][j][k][l] = false;}}}while (!q.empty())q.pop();ok = false;}void bfs() {bic1.x = bx;bic1.y = by;bic1.color = 0;bic1.sta = 0;bic1.sec = 0;q.push(bic1);vis[bx][by][0][0] = true;while(!q.empty()) {bic1 = q.front();q.pop();if (bic1.x == ex && bic1.y == ey && bic1.color == 0) {ok = true;res = bic1.sec;return ;}bic2.x = bic1.x;bic2.y = bic1.y;bic2.color = bic1.color;bic2.sta = (bic1.sta + 3) % 4;bic2.sec = bic1.sec + 1;if (vis[bic2.x][bic2.y][bic2.sta][bic2.color] == false) {q.push(bic2);vis[bic2.x][bic2.y][bic2.sta][bic2.color] = true;}bic2.sta = (bic1.sta + 1) % 4;if (vis[bic2.x][bic2.y][bic2.sta][bic2.color] == false) {q.push(bic2);vis[bic2.x][bic2.y][bic2.sta][bic2.color] = true;}bic2.sta = bic1.sta;bic2.color = (bic1.color + 1) % 5;bic2.x = bic1.x + go[bic1.sta][0];bic2.y = bic1.y + go[bic1.sta][1];if (bic2.x >= 0 && bic2.y >= 0 && bic2.x < n && bic2.y < m && vis[bic2.x][bic2.y][bic2.sta][bic2.color] == false && str[bic2.x][bic2.y] != '#') {q.push(bic2);vis[bic2.x][bic2.y][bic2.sta][bic2.color] = true;}}}int main () {while (cin >> n >> m) {getchar();if (n == 0 && m == 0)break;init();for (int i = 0 ; i < n ;i++)getline (cin ,str[i]);for (int i = 0 ; i < n ; i++) {for (int j = 0; j < m ; j++) {if (str[i][j] == 'S') {bx = i;by = j;}if (str[i][j] == 'T') {ex = i;ey = j;}}}bfs();if (Case != 1)cout << endl;cout <<"Case #" << Case++ <<endl;if (ok == true)cout << "minimum time = "<< res <<" sec" <<endl;elsecout<<"destination not reachable" <<endl;}return 0;}


0 0
原创粉丝点击