仙岛求药

GitHub跳转原题关系图返回列表

题意与原解析均从本地 OpenJudge 缓存迁移。

OJ: noi_openjudge

题目 ID: ch0205-2727

难度:未知

标签:

日期: 2026-07-30 23:01

题意

完整题面见同目录的 problem.md

思路

代码

cpp
/*============================================================================
* Title : noi 2727 仙岛求药
* Author: Rainboy
* Time  : 2016-07-31 19:05
* update: 2016-07-31 19:05
* © Copyright 2016 Rainboy. All Rights Reserved.
*=============================================================================*/

/*  1.走最短的路
 *  2.明显的BFS走迷宫
 *
 * */

#include <cstdio>
#include <cstring>

int fx[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};

/* 迷宫数据 */
char map[40][40];
bool vis[40][40];


struct _node {
    int x,y;
    int step;
};

_node s,t;//起,终点
int m,n;

/* 队列 */
_node queue[10000];
int tail,head;


bool isRight(int x,int y){
    if(x>0 && x<=m && y>0 && y<=n && map[x][y]=='.')
        return true;
    return false;
}

/* 迷宫初始化 */
void maze_init(){
    int i,j;
    for (i=1;i<=m;i++){
        scanf("%s",&map[i][1]);

        for (j=1;j<=n;j++){
            if(map[i][j] == '@')
                s.x=i,s.y=j;
            if(map[i][j] == '*')
                t.x=i,t.y=j;
        }
    }
}


bool bfs(){
    memset(vis,0,sizeof(vis));
    head=tail=0;
    tail++;
    //queue[tail].x=s.x,queue[tail].y=s.y;
    queue[tail]=s;
    queue[tail].step=1;

    while(head !=tail){
        head++;
        int x= queue[head].x;
        int y= queue[head].y;
        int step= queue[head].step;
        int i;
        for (i=0;i<4;i++){
            int nx = x+fx[i][0];
            int ny = y+fx[i][1];
            int n_step = step+1;
            if(nx == t.x && ny == t.y){//边界
                printf("%d\n",step);
                return true;
            }
            
            if(isRight(nx,ny) && vis[nx][ny] ==0){
                tail++;
                queue[tail].x= nx;
                queue[tail].y= ny;
                queue[tail].step= n_step;
                vis[nx][ny]=1;
            }
        }
    }
    printf("-1\n");
    return false;
}

int main(){
    while(1){
        scanf("%d%d",&m,&n);
        if( m==0 && n==0 ) return 0;
        maze_init();
        bfs();
    }
    return 0;
}

复杂度

总结