zoukankan      html  css  js  c++  java
  • hdu 1728 逃离迷宫


    该死的杭电。读入的时候竟然先读入纵坐标。。。

    开始以为是单纯的BFS,结果WA无数次.后来分析后发现因为是要找到最少转向路径,所以要每个方向搜到尽头.

    两个AC代码。。

    #include"stdio.h"
    #include"string.h"
    #include"queue"
    using namespace std;
    int map[101][101];
    char str[101][101];
    int n,m,ex,ey,sx,sy,T,step;
    int d[4][2]={{0,1},{-1,0},{1,0},{0,-1}};
    struct node
    {
        int x,y,step,dir;
    };
    void bfs()
    {
        memset(map,50,sizeof(map));
        queue<node>Q;
        node q,p;
        int k;
        q.x=sx;
        q.y=sy;
        q.step=0;
        q.dir=-1;
        map[q.x][q.y]=0;
        Q.push(q);
        while(!Q.empty())
        {
            q=Q.front();
            Q.pop();
            for(k=0;k<4;k++)
            {
                p=q;
                p.x+=d[k][0];
                p.y+=d[k][1];
                if(p.x>=n||p.x<0||p.y>=m||p.y<0||str[p.x][p.y]=='*')
                    continue;
                if(p.dir!=k&&p.dir!=-1)
                    p.step++;
                if(p.step>step)
                    continue;
                if(p.x==ex&&p.y==ey)
                {
                    printf("yes\n");
                    return ;
                }
                if(map[p.x][p.y]>=p.step)
                {
                    p.dir=k;
                    map[p.x][p.y]=p.step;
                    Q.push(p);
                }
            }
        }
        printf("no\n");
        return ;
    }
    int main()
    
    {
        int i;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(i=0;i<n;i++)
                scanf("%s",str[i]);
            scanf("%d %d %d %d %d",&step,&sy,&sx,&ey,&ex);
            sx--;sy--;ex--;ey--;
            if(sx==ex&&sy==ey)
            {
                printf("yes\n");
                continue;
            }
            else
                bfs();
        }
        return 0;
    }



    #include"stdio.h"
    #include"string.h"
    #include"queue"
    using namespace std;
    struct node
    {
    	int x,y,step;
    }s,e;
    queue<node>qu;
    int d[4][2]={-1,0,0,1,1,0,0,-1};
    bool f[110][110];
    char map[110][110];
    int n,m,bx,by,ex,ey,k;
    void init()
    {
    	memset(f,false,sizeof(f));
    	while(!qu.empty())qu.pop();
    	memset(map,0,sizeof(map));
    }
    bool is_ok(int x,int y)
    {
    	if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]=='.')
    		return true;
    	return false;
    }
    void bfs()
    {
    	int i,xx,yy;
    	if(bx==ex&&by==ey)
    	{
    		printf("yes\n");
    		return ;
    	}
    	f[bx][by]=true;
    	s.x=bx;s.y=by;
    	s.step=-1;
    	qu.push(s);
    	while(!qu.empty())
    	{
    		s=qu.front();
    		qu.pop();
    		for(i=0;i<4;i++)
    		{
    			xx=s.x+d[i][0];
    			yy=s.y+d[i][1];
    			while(is_ok(xx,yy))
    			{
    				if(f[xx][yy]==false)
    				{
    					f[xx][yy]=true;
    					e.x=xx;
    					e.y=yy;
    					e.step=s.step+1;
    					qu.push(e);
    					if(e.x==ex&&e.y==ey&&e.step<=k)
    					{
    						printf("yes\n");
    						return ;
    					}
    				}
    				xx+=d[i][0];
    				yy+=d[i][1];
    			}
    		}
    	}
    	printf("no\n");
    	return ;
    }
    int main()
    {
    	int cas,i;
    	scanf("%d",&cas);
    	while(cas--)
    	{
    		init();
    		scanf("%d%d",&n,&m);
    		for(int i=1;i<=n;i++)
                    for(int j=1;j<=m;j++)
                    scanf(" %c",&map[i][j]);
    
    		scanf("%d%d%d%d%d",&k,&by,&bx,&ey,&ex);
    		bfs();
    	}
    	return 0;
    }
    






  • 相关阅读:
    C# 视频监控系列(11):H264播放器——封装API[HikPlayM4.dll]
    php框架
    ExtJS带验证码登录框[新增回车提交]
    ant 读取环境变量的值
    Apache Velocity实现模板化
    23种设计模式概述
    android资源下载
    无序hashset与hashmap让其有序
    PermGen space错误解决方法
    设计模式之代理模式(Proxy)
  • 原文地址:https://www.cnblogs.com/yyf573462811/p/6365401.html
Copyright © 2011-2022 走看看