算法设计与复杂性理论 第一次上机 仙岛求药

总时间限制: 
1000ms 
内存限制: 
65536kB
描述
少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由M×N个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。
下图 显示了一个迷阵的样例及李逍遥找到仙药的路线.

输入
输入有多组测试数据. 每组测试数据以两个非零整数 M 和 N 开始,两者均不大于20。M 表示迷阵行数, N 表示迷阵列数。接下来有 M 行, 每行包含N个字符,不同字符分别代表不同含义: 
1) ‘@’:少年李逍遥所在的位置;
2) ‘.’:可以安全通行的方格;
3) ‘#’:有怪物的方格;
4) ‘*’:仙药所在位置。
当在一行中读入的是两个零时,表示输入结束。
输出
对于每组测试数据,分别输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1。
样例输入
8 8
.@##...#
#....#.#
#.#.##..
..#.###.
#.#...#.
..###.#.
...#.*..
.#...###
6 5
.*.#.
.#...
..##.
.....
.#...
....@
9 6
.#..#. 
.#.*.# 
.####. 
..#... 
..#... 
..#... 
..#... 
#.@.## 
.#..#. 
0 0
样例输出
10
8
-1

注意这道题的输入,每行有时候会包含多余的空格信息,只能采用cin cout存储字符,用getchar或者scanf的时候会ole。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>

using namespace std;

int M, N;
int maze[25][25];
int people;

class T
{
public:
    int loc;
    int len;
    T(int a, int b)
    {
        loc = a;
        len = b;
    }
};

int bfs()
{
    queue<T> way;
    way.push(T(people, 0));
    while(!way.empty())
    {
        T now = way.front();
        int nowLoc = now.loc;
        int nowLen = now.len;
        way.pop();
        if(nowLoc - N >= 0)
        {
            switch(maze[nowLoc / N - 1][nowLoc % N])
            {
            case (0):
                maze[nowLoc / N - 1][nowLoc % N] = 1;
                way.push(T(nowLoc - N, nowLen + 1));
                break;
            case (2):
                return nowLen + 1;
            }
        }
        if(nowLoc % N - 1 >= 0)
        {
            switch(maze[nowLoc / N][nowLoc % N - 1])
            {
            case (0):
                maze[nowLoc / N][nowLoc % N - 1] = 1;
                way.push(T(nowLoc - 1, nowLen + 1));
                break;
            case (2):
                return nowLen + 1;
            }
        }
        if(nowLoc % N + 1 < N)
        {
            switch(maze[nowLoc / N][nowLoc % N + 1])
            {
            case (0):
                maze[nowLoc / N][nowLoc % N + 1] = 1;
                way.push(T(nowLoc + 1, nowLen + 1));
                break;
            case (2):
                return nowLen + 1;
            }
        }
        if(nowLoc / N + 1 < M)
        {
            switch(maze[nowLoc / N + 1][nowLoc % N])
            {
            case (0):
                maze[nowLoc / N + 1][nowLoc % N] = 1;
                way.push(T(nowLoc + N, nowLen + 1));
                break;
            case (2):
                return nowLen + 1;
            }
        }
    }
    return -1;
}

int main()
{
    char ch;
    cin >> M >> N;
    while(M != 0 && N != 0)
    {
        for(int i = 0; i < M; i++)
        {
            for(int j = 0; j < N; j++)
            {
                cin >> ch;
                switch(ch)
                {
                case ('@'):
                    people = i * N + j;
                    maze[i][j] = 1;
                    break;
                case ('.'):
                    maze[i][j] = 0;
                    break;
                case ('#'):
                    maze[i][j] = -1;
                    break;
                case ('*'):
                    maze[i][j] = 2;
                }
            }
        }
        cout << bfs() << endl;
        cin >> M >> N;
    }
    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <queue>

using namespace std;

int m, n;
int maze[25][25];
int x, y;

typedef struct position
{
    int row;
    int col;
    int pace;
}pos;

int bfs()
{
    queue<pos> q;

    int p = -1;
    pos start;
    start.row = x;
    start.col = y;
    start.pace = 0;
    q.push(start);

    while(!q.empty())
    {
        pos now = q.front();
        q.pop();

        int x1 = now.row;
        int y1 = now.col;

        if(x1 > 1)
        {
            switch(maze[x1 - 1][y1])
            {
            case 0:
                pos next;
                next.row = x1 - 1;
                next.col = y1;
                next.pace = now.pace + 1;
                q.push(next);
                maze[x1 - 1][y1] = 1;
                break;
            case 2:
                return now.pace + 1;
            }
        }
        if(x1 < m)
        {
            switch(maze[x1 + 1][y1])
            {
            case 0:
                pos next;
                next.row = x1 + 1;
                next.col = y1;
                next.pace = now.pace + 1;
                q.push(next);
                maze[x1 + 1][y1] = 1;
                break;
            case 2:
                return now.pace + 1;
            }
        }
        if(y1 > 1)
        {
            switch(maze[x1][y1 - 1])
            {
            case 0:
                pos next;
                next.row = x1;
                next.col = y1 - 1;
                next.pace = now.pace + 1;
                q.push(next);
                maze[x1][y1 - 1] = 1;
                break;
            case 2:
                return now.pace + 1;
            }
        }
        if(y1 < n)
        {
            switch(maze[x1][y1 + 1])
            {
            case 0:
                pos next;
                next.row = x1;
                next.col = y1 + 1;
                next.pace = now.pace + 1;
                q.push(next);
                maze[x1][y1 + 1] = 1;
                break;
            case 2:
                return now.pace + 1;
            }
        }
    }
    return p;
}

int main()
{
    //scanf("%d%d", &m, &n);
    cin >> m >> n;
    while(m != 0 || n != 0)
    {
        //getchar();
        for(int i = 1; i <= m; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                char ch;
                //ch = getchar();
                //scanf("%c", &ch);
                cin >> ch;
                switch(ch)
                {
                case '@':
                    x = i;
                    y = j;
                    maze[i][j] = 1;
                    break;
                case '.':
                    maze[i][j] = 0;
                    break;
                case '#':
                    maze[i][j] = -1;
                    break;
                case '*':
                    maze[i][j] = 2;
                    break;
                }
            }
            //getchar();
        }

        //printf("%d\n", bfs());
        cout << bfs() << endl;
        //scanf("%d%d", &m, &n);
        cin >> m >> n;
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值