hdu1728

//开始时不是wa就是re,做出来之后疯狂的交了五六次得意


#include<stdio.h>  
#include<string.h>
int n,m,k,maze[200][200],vis[200][200];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};//UDLR
int x1,y1,x2,y2;
typedef struct
{
	int x,y,count;
}node;
node q[200001];
int bfs()
{
	int i,rear,front;
	node a,b;
	a.x=x1;
	a.y=y1;
	a.count=-1;
	rear=front=0;
	q[rear++]=a;
	while(rear>front)
	{
		a=q[front++];
		for(i=0;i<4;i++)
		{
			b.x=a.x+dx[i];
			b.y=a.y+dy[i];
			while(b.x>=0&&b.x<n &&b.y>=0&&b.y<m&&maze[b.x][b.y]==0)
			{
				if(vis[b.x][b.y]==0)
				{
					vis[b.x][b.y]=1;
					b.count=a.count+1;
					if(b.count>k)  return 0;
					if(b.x==x2&&b.y==y2)  return 1;
					q[rear++]=b;
				}
				b.x+=dx[i];
			    b.y+=dy[i];
			}
		}
	}
	return 0;
}
main()
{
	int i,j,t;
	char str[200];
	//freopen("D:\\o.txt","r",stdin);
	scanf("%d",&t);
	while(t--)
	{
		memset(vis,0,sizeof(vis));
		scanf("%d%d",&n,&m);
		getchar();
		for(i=0;i<n;i++)
		{
			gets(str);
			for(j=0;j<m;j++)
			{
				if(str[j]=='*')
					maze[i][j]=1;
				else maze[i][j]=0;
			}
		}
		scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);
		x1--;y1--;
		x2--;y2--;
		if(bfs())
			printf("yes\n");
		else 
			printf("no\n");
	}
	return 0;
}


#include<stdio.h>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<set>
#include<queue>
#include<map>
#include<utility>
#include<string>
#include<algorithm>
#define LL __int64
#define MOD 1000000007
#define M 100010
using namespace std;
int n,m,ok;
int x11,y11,x22,y22,k;
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
char s[110][110];
int vis[110][110];
int dist[110][110];
int q[100010][2];
int bfs()
{
    int front=0,rear=0;
    //vis[x11][y11]=1;
    dist[x11][y11]=-1;
    q[rear][0]=x11;
    q[rear++][1]=y11;
    while(rear>front)
    {
        int x=q[front][0],y=q[front][1];
        front++;
        for(int i=0;i<4;i++)
        {
            int xx=x+dx[i],yy=y+dy[i];
            while(xx>=0&&yy>=0&&xx<n&&yy<m&&s[xx][yy]=='.')
            {
                if(vis[xx][yy]==0)
                {
                    vis[xx][yy]=1;
                    dist[xx][yy]=dist[x][y]+1;
                    if(dist[xx][yy]>k)return 0;
                    if(xx==x22&&yy==y22)return 1;
                    //printf("%d %d\n",xx,yy);
                    q[rear][0]=xx;
                    q[rear++][1]=yy;
                }
                xx+=dx[i];
                yy+=dy[i];
            }
        }
    }
    return 0;
}
int main()
{
    int  i,j,z,T;
    //freopen("D:\\o.txt","r",stdin);
    scanf("%d",&T);
    while(T--)
    {
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        getchar();
        for(i=0;i<n;i++)
            gets(s[i]);
        scanf("%d%d%d%d%d",&k,&y11,&x11,&y22,&x22);
        y11--;x11--;y22--;x22--;
        if(bfs())puts("yes");
        else puts("no");
    }
    return 0;
}



#include<stdio.h>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<set>
#include<queue>
#include<map>
#include<utility>
#include<string>
#include<algorithm>
#define LL __int64
#define MOD 1000000007
#define M 100010
using namespace std;
int n,m,ok;
int x11,y11,x22,y22,k;
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};//U D L R
char s[110][110];
int vis[110][110];
int dist[110][110];
int q[100010][2];
void bfs()
{
    int front=0,rear=0,i,j,d;
    q[rear][0]=x11;
    q[rear++][1]=y11;
    //q[rear++]=x11*n+y11;
    //vis[x11][y11]=1;
    dist[x11][y11]=-1;
    while(rear>front)
    {
        //int x=q[front]/n,y=q[front]%n;
        //printf("%d %d\n",x,y);
        /*if(x==x22&&y==y22&&dist[x][y]<=k){
                ok=1;
                return;
        }*/
        int x=q[front][0],y=q[front][1];
        front++;
        for(i=0;i<4;i++)
        {
            for(j=1;;j++)
            {
                int xx=x+dx[i]*j,yy=y+dy[i]*j;
                if(xx<0||yy<0||xx>=n||yy>=m)break;
                if(s[xx][yy]=='*')break;
                if(vis[xx][yy])continue;
                dist[xx][yy]=dist[x][y]+1;
                if(dist[xx][yy]>k)return ;
                if(xx==x22&&yy==y22)
                {
                    ok=1;
                    return ;
                }
                vis[xx][yy]=1;
                q[rear][0]=xx;
                q[rear++][1]=/*xx*n+*/yy;
                //printf("dist %d %d %d\n",dist[xx][yy],xx,yy);
            }
        }
    }
}
int main()
{
    int  i,j,z,T;
    ///freopen("D:\\o.txt","r",stdin);
    scanf("%d",&T);
    while(T--)
    {
        ok=0;
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        getchar();
        for(i=0;i<n;i++)
            gets(s[i]);
        scanf("%d%d%d%d%d",&k,&y11,&x11,&y22,&x22);
        y11--;x11--;y22--;x22--;
        //vis[x11][y11]=0;
        bfs();
        if(ok)puts("yes");
        else puts("no");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值