zoukankan      html  css  js  c++  java
  • HDU 4770

     这题说的是一在一个N*M的房间内,然后有些房间不能被灯光照亮,有一个灯可以转动方向,其他的灯只能在固定一个方向上,因为数据比较小,所以比较水,直接暴力的进行枚举就好了,但是还是 wa了很久,原因没认真读题,然后就是小细节的错误,在标记的时候背后面的,点给覆盖了,(考虑不周全)。

    #include <iostream>
    #include<string.h>
    #include<cstdio>
    using namespace std;
    const int MAXX=1000000;
    struct point
    {
       int  x,y;
       point (int a=0,int b=0){x=a;y=b;}
    };
    bool operator ==(const point &a,const point &b)
    {
        return a.x==b.x&&a.y==b.y;
    }
    point operator +(point a,point b){ return point(a.x+b.x,a.y+b.y);}
    char map[205][205];
    int mark[205][205];
    point p3[4][2]=
    { 
    	{point(0,-1),point(-1,0)},{point(-1,0),point(0,1)},
    	{point(0,1),point(1,0)},{point(1,0),point(0,-1)}
     };
    point p1[8][2]=
    {                {point(0,-1),point(1,-1)},{point(0,-1),point(-1,-1)},
                     {point(-1,0),point(-1,-1)},{point(-1,0),point(-1,1)},
                     {point(0,1),point(-1,1)},{point(0,1),point(1,1)},
                     {point(1,0),point(1,1)},{point(1,0),point(1,-1)}
    };
    point aboutt[20],mayt[20],hoct[20],bet[20];
    int n,m,LENa,LENm,LENc,MINlen,mayLEN,LENb;
    bool work1()
    {
        int i;
    	point B=hoct[0],temp1,temp2;
        for(i=0;i<4;i++)
        {
            temp1=B+p3[i][0];
    		temp2=B+p3[i][1];
    		if(map[temp1.x][temp1.y]==0&&map[temp2.x][temp2.y]==0)
                return true;
        }
        for(i=0;i<8;i++)
        {
            
             temp1=B+p1[i][0];
    		 temp2=B+p1[i][1];
            if(map[temp1.x][temp1.y]==0&&mark[temp1.x][temp1.y]!=2&&map[temp2.x][temp2.y]==0&&temp1.x<=n&&temp1.y<=m)
                    return true;
        }
        return false;
    }
    bool work2()
    {
        point temp1,temp2;
    	point A=hoct[0],B=hoct[1];
        for(int i =0;i<8;i++)
    	{
    		temp1=A+p1[i][0];
    		temp2=A+p1[i][1];
    		if(temp1==B&&map[temp2.x][temp2.y]==0) return true;
    		if(temp2==B&&map[temp1.x][temp1.y]==0&&mark[temp1.x][temp1.y]!=2&&temp1.x<=n&&temp1.y<=m)
    			return true;
    	}
            return false;
    }
    bool work3()
    {
        int i;
        point A=hoct[0],B=hoct[1],C=hoct[2],temp1,temp2;
        for( i=0;i<4;i++)
            {
                temp1=A+p3[i][0];
                temp2=A+p3[i][1];
                if(temp1==B&&temp2==C) return true;
                if(temp2==B&&temp1==C) return true;
            }
        for( i=0;i<4;i++)
            {
                temp1=B+p3[i][0];
                temp2=B+p3[i][1];
                if(temp1==A&&temp2==C) return true;
                if(temp2==A&&temp1==C) return true;
            }
        for( i=0;i<4;i++)
            {
                temp1=C+p3[i][0];
                temp2=C+p3[i][1];
                if(temp1==B&&temp2==A) return true;
                if(temp2==B&&temp1==A) return true;
    	} 
       return false;
    }
    bool print_subet(int s)
    {
    	int i;
        LENb=0;
        memset(mark,0,sizeof(mark));
        for( i=0;i<LENm;i++)
        if(s&(1<<i)) {
    		bet[LENb++]=mayt[i];
            mark[mayt[i].x][mayt[i].y]=2;
    	  if(mark[mayt[i].x][mayt[i].y+1]!=2)
             mark[mayt[i].x][mayt[i].y+1]=1;
    	  if(mark[mayt[i].x-1][mayt[i].y]!=2)
    	     mark[mayt[i].x-1][mayt[i].y]=1;
          }
         LENc=0;
        for( i=0;i<LENa;i++)
            if(mark[aboutt[i].x][aboutt[i].y]==0)
             hoct[LENc++]=aboutt[i];
    		if(LENc>3) return false;
        if(LENc==0) { mayLEN=LENb; return true;  }
        if(LENc==1) { if(work1()){mayLEN=LENb+1;return true;}}
        if(LENc==2) { if(work2()){mayLEN=LENb+1;return true;}}
        if(LENc==3) { if(work3()){mayLEN=LENb+1;return true;}}
    	return false;
    }
    int main()
    {
        int i,j;
         while(scanf("%d%d",&n,&m)==2)
            {
    		 if((n+m)==0) break;
               mayLEN=MINlen=MAXX;
    			LENa=LENm=0;
               memset(map,0,sizeof(map));
                for( i=1;i<=n;i++)
                {
                    scanf("%s",map[i]+1);
    				for( j=1;j<=m;j++)
    				{
                       if(map[i][j]=='.')
    				   {
    					map[i][j]=0;
                        aboutt[LENa++]=point(i,j);
    				   }
    				}
    			}
                for( i=0;i<LENa;i++)
                    if(map[aboutt[i].x][aboutt[i].y+1]==0&&map[aboutt[i].x-1][aboutt[i].y]==0)
                       mayt[LENm++]=aboutt[i];
                for( i=0;i<(1<<LENm);i++)
                if(print_subet(i))
    			{
    				if(MINlen>mayLEN)
    					MINlen=mayLEN;
    			}
                 
    			if(MINlen==MAXX)  puts("-1");
                else printf("%d
    ",MINlen);
            }
    
    
        return 0;
    }
    


  • 相关阅读:
    003-2021 java.sql.SQLSyntaxErrorException: Unknown column 'Kitty' in 'where clause'
    002-2021 SpringMVC文件跨服务器上传异常之 409 : 目录不存在
    001-2021 SpringMVC文件跨服务器上传异常之405 : UniformInterfaceException : PUT http://localhost:9090/uploads/xxx returned a response status of 405 Method Not Allowed
    JUnit错误 : java.lang.NoSuchMethodError: org.junit.runner.Description.createSuiteDescription
    char[]
    Sql语句执行与书写顺序
    Java深拷贝和浅拷贝区别
    C++析构函数详解
    浅谈c/c++中register关键字
    C++异常之栈解旋
  • 原文地址:https://www.cnblogs.com/Opaser/p/3662048.html
Copyright © 2011-2022 走看看