烟台大学 oj 1006

烟台大学 计算机学院 软件工程 王朝
#include<iostream>//头文件输入输出流
#include<cstdio>//将c中的stdio在c++表示出来
#include<cstring>//将c中的string在c++表示出来
#include<queue>/*#include<queue>       #include<queue>
详细用法:
定义一个queue的变量     queue<Type> M
查看是否为空范例        M.empty()    是的话返回1,不是返回0;
从已有元素后面增加元素   M.push()
输出现有元素的个数      M.size()
显示第一个元素          M.front()
显示最后一个元素        M.back()
清除第一个元素          M.pop()
*/
using namespace std;//定义全局空间
int dir[4][2] = {1,0,-1,0,0,1,0,-1};//表示移动方向
char map[1000][1000];//地图
int vis[1000][1000];//用来标记是否走过
int sx,sy,px,py,t,n,m,flag,f;
struct step
{
    int x;
    int y;
    int s;
};

void bfs()
{
    queue<step> q;//直接调用队列
    step p;//定义结构体
    p.x = sx;//初始坐标表示
    p.y = sy;
    p.s = 0;
    vis[sx][sy] = 1;//未走过的位置表示为1
    q.push(p);//起点入队

    while(!q.empty()){//起点入队后开始循环
        step p = q.front();//将元素赋值于结构体
        if(p.x==px && p.y==py)//找到位置
            {
            flag =1;//计flag为1
            if(p.s<=t)//未超天数
            {
                f=1;//计为1
                printf("YES\n");
                break;
            }
        }

        step v;
        for(int i=0 ;i<4 ;i++)
        {
            v.x = p.x + dir[i][0];//坐标的移动
            v.y = p.y + dir[i][1];
            if(map[v.x][v.y]=='*')//不合适再返回
            {//路不通(有墙壁)
                continue;
            }
            if(v.x>=0 && v.x<n && v.y>=0 && v.y<m && vis[v.x][v.y]==0)
            {
                v.s = p.s + 1;
                q.push(v);
                vis[v.x][v.y] = 1;
            }
        }
        q.pop();
    }
    if(flag==0||f==0){ //1.flag==0说明无法到达2.flag!=0,f==0,说明可以到达但是时间不够
        printf("NO\n");
    }
}
int main()
{
    while(cin>>m>>n>>t){
        if(n==0&&m==0&&t==0){
            break;
        }
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));
        for(int i=0 ;i<n ;i++){
            for(int j=0 ;j<m ;j++){
                cin>>map[i][j];
                if(map[i][j]=='S'){
                    sx = i;
                    sy = j;
                }
                if(map[i][j]=='P'){
                    px = i;
                    py = j;
                }
            }
        }
        flag = 0;
        f = 0;
        bfs();
    }
}
//着如何表示出来的对于此题的理解我只能到此为止我有一处不理解的是迷宫问题此题应是最优解,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值