zoukankan      html  css  js  c++  java
  • POJ 3669 Meteor Shower

        BFS。

        这题是个坑。很久没刷题了,偏偏又遇上这个坑题。下面是坑点:

        数据范围是400 400,而不是题目所写的300 300,否则会WA。坑不?我WA了3次才发现。

        由于输入巨大,一定要用scanf,而不能用cin,否则会超时。这个是我忘了,不能算题目坑。



    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define MAX_X 400
    #define MAX_Y 400
    int a[MAX_X+1][MAX_Y+1];
    bool vi[MAX_X+1][MAX_Y+1];
    struct Pos{
    int x;
    int y;
    int t;
    };
    Pos v[4]={{0,1},{0,-1},{1,0},{-1,0}};
    queue<Pos> qe;
    bool canMove(int x, int y, int t)
    {
    	
    	if(!(x<0||y<0||x>MAX_X||y>MAX_Y)&&(t<a[x][y]||a[x][y]==-1))
    	{
    		return true;
    	}
    	return false;
    }
    
    bool isSafe(Pos& pos)
    {
    	int x=pos.x, y=pos.y, t=pos.t;
    	if(!(x<0||y<0||x>MAX_X||y>MAX_X)&&a[x][y]==-1)
    		return true;
    	return false;
    }
    
    bool fuck()
    {
    	Pos start={0,0,0};
    	
    	if(isSafe(start))
    	{
    		printf("%d\n",start.t);
    		return true;
    	}
    	qe.push(start);
    	vi[0][0]=true;
    	int t=0;
    	while(!qe.empty())
    	{
    		//
    		Pos p=qe.front();
    		int time=p.t;
    		qe.pop();
    
    		++time;
    		for(int i=0;i<4;i++)
    		{
    			int xx=p.x+v[i].x,yy=p.y+v[i].y;
    			if(canMove(xx,yy,time)&&vi[xx][yy]==false)
    			{
    				
    				Pos pTmp={xx,yy,time};	
    				if(isSafe(pTmp))
    				{
    					printf("%d\n",pTmp.t);
    					return true;
    				}
    				qe.push(pTmp);
    				vi[xx][yy]=true;
    			}
    		}
    	}
    	return false;
    }
    
    void init(int x, int y)
    {
    
    	if(x==MAX_X&&y==MAX_Y){
    		memset(a,-1,sizeof(a));
    		memset(vi,false,sizeof(vi));
    	}		
    	else{
    		for(int i=0;i<=x;i++)
    			for (int j=0;j<=y;j++)
    			{
    				a[i][j]=-1;
    				vi[i][j]=false;
    			}
    	}
    }
    
    void clearQ()
    {
    	while(!qe.empty())
    	{
    		qe.pop();
    	}
    }
    
    int main()
    {
    	int m,n;
    	init(MAX_X,MAX_Y);
    	while(scanf("%d",&m)!=EOF)
    	{
    		int x=0,y=0;
    		for(int i=0;i<m;i++)
    		{
    			int j,k,tt;
    			scanf("%d%d%d",&j,&k,&tt);
    
    			if(a[j][k]>tt||a[j][k]==-1)
    				a[j][k]=tt;
    
    			if(j>x)
    				x=j;
    			if(k>y)
    				y=k;
    
    			for(int p=0;p<4;p++)
    			{
    				int xx=j+v[p].x, yy=k+v[p].y;
    				if(!(xx<0||yy<0||xx>MAX_X||yy>MAX_Y)){
    					int t=a[xx][yy];
    					if(t==-1||t>tt)
    						a[xx][yy]=tt;
    				}
    			}
    		}
    
    
    		if(fuck()==false)
    			printf("-1\n");
    
    		clearQ();
    		init(x,y);
    	}
    return 0;
    }


  • 相关阅读:
    响应头中的 ETag 值是如何生成的
    http请求状态码
    RPC 和 REST 有什么优劣
    comet 长轮询与 node 实现
    HTTPS 加密
    iterm2 快捷键
    static in C/C++
    03-树3 Tree Traversals Again
    2016.03.19随笔
    03-树2 List Leaves
  • 原文地址:https://www.cnblogs.com/xlert/p/3960440.html
Copyright © 2011-2022 走看看