逃离迷宫

★实验任务
给定一个 m× n(m 行, n 列) 的迷宫, 迷宫中有两个位置, gloria 想从迷宫的一个位置走
到另外一个位置, 当然迷宫中有些地方是空地, gloria 可以穿越, 有些地方是障碍, 她必
须绕行,从迷宫的一个位置,只能走到与它相邻的 4 个位置中, 当然在行走过程中, gloria
不能走到迷宫外面去。令人头痛的是, gloria 是个没什么方向感的人,因此,她在行走过
程中, 不能转太多弯了, 否则她会晕倒的。我们假定给定的两个位置都是空地, 初始时, gloria
所面向的方向未定, 她可以 选择 4 个方向的任何一个出发, 而不算成一次转弯。 gloria 能
从一个位置走到另外一个位置吗?
★数据输入
第 1 行为两个整数 m, n (1 ≤ m, n ≤ 100), 分别表示迷宫的行数和列数,接下来 m
行, 每行包括 n 个字符, 其中字符'.' 表示该位置为空地, 字符'*' 表示该位置为障碍, 输入
数据中只有这两种字符,每组测试数据的最后一行为 5 个整数 k, x1, y1, x2, y2 (0 ≤ k ≤
20, 1 ≤ x1, x2 ≤ m, 1 ≤ y1, y2 ≤ n), 其中 k 表示 gloria 最多能转的弯数, (x1, y1), (x2,
y2) 表示两个位置,其中 x1, x2对应行, y1, y2对应列。
★数据输出
每组测试数据对应为一行,若 gloria 能从一个位置走到另外一个位置,输出“yes” ,
否则输出“no” 。
输入示例         输出示例
5 5                yes
...**
*.**.
.....
.....
*....
2 1 1 3 1

#include  
#include  
#include  
#include  
using namespace std;  
const int maxn=111;  
struct Node{  
    int x,y,turn;  
    Node(int a,int b){  
        x=a; y=b; turn=-1;  
    }  
    Node(){}  
};  
int n,m;  
int k,is,js,it,jt;  
int map[maxn][maxn];  
int offset[4][2]={{0,-1},{0,1},{-1,0},{1,0}};  
  
void init(){  
    int i,j;  
    char c;  
    for(i=0;i<=n+1;i++) map[i][0]=map[i][m+1]=1;  
    for(j=0;j<=m+1;j++) map[0][j]=map[n+1][j]=1;  
    for(i=1;i<=n;i++){  
        getchar();  
        for(j=1;j<=m;j++){  
            scanf("%c",&c);  
            if(c=='.') map[i][j]=0;  
            else map[i][j]=1;  
        }  
    }  
}  
  
void bfs(){  
    int flag=0,i;  
    queue Q;  
    Node node(is,js),next;  
    map[is][js]=-1;  
    Q.push(node);  
    while(!Q.empty()){  
        node=Q.front();  
        Q.pop();  
        if(node.x==it&&node.y==jt&&node.turn<=k){  
            flag=1;  
            break;  
        }  
        next.turn=node.turn+1;  
        for(i=0;i<4;i++){  
            int a=node.x+offset[i][0];  
            int b=node.y+offset[i][1];  
            while(map[a][b]!=1){  
                if(!map[a][b]){  
                    map[a][b]=-1;  
                    next.x=a; next.y=b;  
                    Q.push(next);  
                }  
                a+=offset[i][0];  
                b+=offset[i][1];  
            }  
        }  
    }  
    printf(flag?"yes\n":"no\n");  
}  
  
int main(){  
    scanf("%d%d",&n,&m);  
    init();  
    scanf("%d%d%d%d%d",&k,&is,&js,&it,&jt);  
    bfs();  
    return 0;  
}  



你可能感兴趣的:(算法分享)