pku2251(广度优先搜索)

来源:互联网 发布:深圳工业生产数据 编辑:程序博客网 时间:2024/04/28 10:26

我是用广搜做的,可是TLE,很郁闷,现在还没找出错误来。。。。。

TLE的代码:

/*
 * File:   main.cpp
 * Author: Administrator
 *
 * Created on 2010年1月27日, 上午11:51
 */

#include <stdlib.h>
#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
#define Max_Size 35

bool visited[Max_Size][Max_Size][Max_Size], flag;
char ch[Max_Size][Max_Size][Max_Size];
int S_x, S_y, S_z, E_x, E_y, E_z, L, R, C;

struct Node {
    int x, y, z;
    int Time;
};

bool Is_Ok(int x, int y, int z) {
    if (x >= 1 && x <= L && y >= 1 && y <= R && z >= 1 && z <= C)
        return true;
    else
        return false;
}

void BFS() {
    int i;
    flag = 1;
    queue<Node>q;
    Node n1, n2, n3;
    n1.Time = 0;
    n1.x = S_x;
    n1.y = S_y;
    n1.z = S_z;
    visited[S_x][S_y][S_z] = false;
    q.push(n1);
    while (!q.empty()) {
        n2 = q.front();
        q.pop();
        if (n2.x == E_x && n2.y == E_y && n2.z == E_z) {
            cout << "Escaped in " << n2.Time << " minute(s)./n";
            flag = 0;
            break;
        }
        n3.x += n2.x - 1;
        n3.y = n2.y;
        n3.z = n2.z;
        if (Is_Ok(n3.x, n3.y, n3.z) && visited[n3.x][n3.y][n3.z]) {
            visited[n2.x][n2.y][n2.z] = false;
            n3.Time = n2.Time + 1;
            q.push(n3);
        }
        n3.x = n2.x;
        n3.y = n2.y - 1;
        n3.z = n2.z;
        if (Is_Ok(n3.x, n3.y, n3.z) && visited[n3.x][n3.y][n3.z]) {
            visited[n2.x][n2.y][n2.z] = false;
            n3.Time = n2.Time + 1;
            q.push(n3);
        }
        n3.x = n2.x;
        n3.y = n2.y;
        n3.z = n2.z - 1;
        if (Is_Ok(n3.x, n3.y, n3.z) && visited[n3.x][n3.y][n3.z]) {
            visited[n2.x][n2.y][n2.z] = false;
            n3.Time = n2.Time + 1;
            q.push(n3);
        }
        n3.x = n2.x + 1;
        n3.y = n2.y;
        n3.z = n2.z;
        if (Is_Ok(n3.x, n3.y, n3.z) && visited[n3.x][n3.y][n3.z]) {
            visited[n2.x][n2.y][n2.z] = false;
            n3.Time = n2.Time + 1;
            q.push(n3);
        }
        n3.x = n2.x;
        n3.y = n2.y + 1;
        n3.z = n2.z;
        if (Is_Ok(n3.x, n3.y, n3.z) && visited[n3.x][n3.y][n3.z]) {
            visited[n2.x][n2.y][n2.z] = false;
            n3.Time = n2.Time + 1;
            q.push(n3);
        }
        n3.x = n2.x;
        n3.y = n2.y;
        n3.z = n2.z + 1;
        if (Is_Ok(n3.x, n3.y, n3.z) && visited[n3.x][n3.y][n3.z]) {
            visited[n2.x][n2.y][n2.z] = false;
            n3.Time = n2.Time + 1;
            q.push(n3);
        }
    }
    if (flag == 1) {
        cout << "Trapped!" << endl;
        return;
    }
}

/*
 *
 */
int main(int argc, char** argv) {

    int i, j, k;
    while (scanf("%d%d%d", &L, &R, &C) != EOF)//scanf("%d%d%d",&L,&R,&C)
    {
        if (L == 0 && R == 0 && C == 0)break;
        //memset(visited,false,sizeof(visited));
        for (i = 1; i <= L; i++) {
            for (j = 1; j <= R; j++) {
                for (k = 1; k <= C; k++) {
                    cin >> ch[i][j][k];
                    //scanf("%c",&ch[i][j][k]);
                    if (ch[i][j][k] == 'S') {
                        S_x = i;
                        S_y = j;
                        S_z = k;
                        visited[i][j][k] = true;
                    } else if (ch[i][j][k] == 'E') {
                        E_x = i;
                        E_y = j;
                        E_z = k;
                        visited[i][j][k] = true;
                    } else if (ch[i][j][k] == '#') {
                        visited[i][j][k] = false;
                    } else if (ch[i][j][k] == '.') {
                        visited[i][j][k] = true;
                    }
                }
                //getchar();
            }
            // getchar();
        }
        //getchar();
        BFS();
    }
    return (EXIT_SUCCESS);
}

 

原创粉丝点击