• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            forestkeeper

            C++博客 首頁 新隨筆 聯系 聚合 管理
              3 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
            題意是一個覆蓋問題,用n個各種邊長的小三角形來覆蓋一個六邊形,基本上可以直接深搜,可以試著覆蓋六分之一,三分之一和二分之一至全部,四種覆蓋形式有一種達到完全覆蓋即可退出,以此來降低復雜度。

            對三角形坐標的表示上采用了如下的表示法:

                                                                             
            以這種方式來表示整個六邊形上的三角形(圖畫的比較省略。。因為我只會用畫圖。。。。)

            這題主要的難點不在思路,而在coding
            #include<iostream>
            #include
            <cstring>
            using namespace std;
            int l,n;
            int t[10];
            bool b[60][110];
            bool used[26];
            bool square_vis[6*25*25+1];
            int zero;
            struct node
            {
                
            int x;
                
            int y;
            }
             stack[1000];
            void flood_line(int x,int y,int l,int c)
            {
                
            int i,j;
                
            int tx,ty;
                
            if ((x+y)%2)
                
            {
                    i 
            = l-1;
                    
            for (j=y-i; j<=y+i; j++)
                       b[x
            +i][j] = c;        
                }

                
            else
                
            {
                    i 
            = l-1;
                    tx 
            = x+i;
                    ty 
            = y+i;
                    
            for (j=0; j<2*i+1; j++)
                    
            {
                        b[tx][ty] 
            = c;
                        
            if (j%2)ty++;
                        
            else tx--;
                    }

                }

            }

            void flood(int x,int y,int l,int c)
            {
                
            if ((x+y)%2)
                
            {
                    
            for (int i=0; i<l; i++)
                     
            for (int j=y-i; j<=y+i; j++)
                       b[x
            +i][j] = c;
                }

                
            else
                
            {
                    
            for (int i =0; i<l; i++)
                    
            {
                        
            int tx = x+i;
                        
            int ty = y+i;
                     
            for (int j=0; j<2*i+1; j++)
                     
            {
                        b[tx][ty] 
            = c;
                        
            if(j%2)
                         ty
            ++;
                         
            else tx--;
                     }

                    }

                }

            }

            int cal(int x,int y)
            {
                
            int tx,ty,i,j;
                
            if ((x+y)%2)
                
            {
                    
            for (i=0; ; i++)
                     
            for  (j=y-i; j<=y+i; j++)
                      
            if(b[x+i][j])
                        
            return i;
                }

                
            else
                
            {
                    
            for (i=0; ; i++)
                    
            {
                        tx 
            = x+i;
                        ty 
            = y+i;
                        
            for (j=0; j<2*i+1; j++)
                        
            {
                            
            if (b[tx][ty])
                              
            return i;
                            
            if (j%2)
                              ty
            ++;
                              
            else tx--;
                        }

                    }

                }

            }

            bool search(int step)
            {
                
            int x,y;
                
            int i,maxl;
                x 
            = stack[step-1].x;
                y 
            = stack[step-1].y;
                
                
            while(x<2*l)
                
            {
                    
            if (b[x][y]) y++;
                    
            else break;
                    
            if (y>100)
                    
            {
                        x
            ++; y=0;
                    }

                }

                
            if (x>=2*l)
                 
            return true;
                maxl 
            = cal(x,y);
                flood(x,y,maxl,
            1);
                zero 
            -= maxl*maxl;
                stack[step].x
            = x;
                stack[step].y 
            = y;
                
                
            for (i=maxl; i>=2; i--)
                
            {
                 
            if(used[i]&&square_vis[zero]&&search(step+1))
                   
            return true;
                   flood_line(x,y,i,
            0);
                   zero
            +=(2*i-1);
                }

                b[x][y] 
            = 0;
                zero
            ++;
                
            return false;
            }

            void init()
            {
                memset(used,
            false,sizeof(used));
                cin 
            >> l;
                cin 
            >> n;
                
            for (int i=0; i<n; i++)
                
            {
                  cin 
            >> t[i];
                  used[t[i]] 
            = true;
                }

                n 
            = 0;
                
            for (int i=1; i<=l; i++)
                 
            if (used[i])
                     t[n
            ++= i;
            }

            void run()
            {
                
            for(int i=0; i<n; i++)
                 
            if(l%t[i]==0)
                 
            {
                     cout 
            << "YES"<<endl;
                     
            return;
                 }

                
            bool length_vis[26];
                memset(length_vis,
            false,sizeof(length_vis));
                length_vis[
            0= true;
                
            for (int i = 0; i<=l; i++)
                
            if (length_vis[i])
                  
            for (int j=0; j<n; j++)
                   
            if (i+t[j]<=l)
                     length_vis[i
            +t[j]] = true;
               
            if (!length_vis[l])
               
            {
                      cout 
            << "NO"<<endl;
                      
            return;
               }

               memset(square_vis,
            false,sizeof(square_vis));
               square_vis[
            0= true;
               
            for (int i=0; i<=6*l*l; i++)
               
            if (square_vis[i])
                 
            for (int j=0; j<n; j++)
                  
            if (i+t[j]*t[j]<=6*l*l)
                    square_vis[i
            +t[j]*t[j]]= true;
               
            if (!square_vis[6*l*l])
               
            {
                      cout 
            << "NO"<<endl;
                      
            return;
               }

               memset(b,
            true,sizeof(b));
               flood(
            0,25,l,0);
               zero 
            = l*l;
               stack[
            0].x = 0;
               stack[
            0].y = 25;
               
            if (search(1))
               
            {
                      cout 
            << "YES"<<endl;
                      
            return;
               }

               memset(b,
            true,sizeof(b));
               flood(
            0,25,l,0);
               flood(
            0,26,l,0);
               zero 
            = l*l*2;
               
            if (search(1))
               
            {
                      cout
            << "YES"<<endl;
                      
            return;
               }

               memset(b,
            true,sizeof(b));
               flood(
            0,25,l,0);
               flood(
            0,26,l,0);
               flood(
            0,25+2*l,l,0);
               zero 
            = l*l*3;
               
            if (search(1))
               
            {
                      cout 
            << "YES"<<endl;
                      
            return;
               }

               memset(b,
            true,sizeof(b));
               flood(
            0,25,l,0);
               flood(
            0,26,l,0);
               flood(
            0,25+2*l,l,0);
               flood(l,
            25-l+1,l,0);
               flood(l,
            25+l,l,0);
               flood(l,
            25+l+1,l,0);
               zero 
            = 6*l*l;
               
            if (search(1))
               
            {
                     cout 
            << "YES"<<endl;
                     
            return
               }

               cout 
            << "NO"<<endl;
               
            return;
            }

            int main()
            {
                
            int cas;
                cin 
            >> cas;
                
            while(cas--)
                
            {
                init();
                run();
                }

            }


            posted on 2010-01-08 10:32 forestkeeper 閱讀(1403) 評論(0)  編輯 收藏 引用
            久久精品国产亚洲麻豆| 东京热TOKYO综合久久精品| 狠狠久久综合| 一日本道伊人久久综合影| 狠狠色噜噜色狠狠狠综合久久| 伊人色综合久久天天人手人婷| 成人综合伊人五月婷久久| 老司机国内精品久久久久| 久久久久久久免费视频| 久久精品国产影库免费看| 四虎亚洲国产成人久久精品| 久久久免费精品re6| 欧美日韩中文字幕久久久不卡| 乱亲女H秽乱长久久久| 亚洲中文字幕伊人久久无码 | 色狠狠久久AV五月综合| 久久精品国产影库免费看| 97精品伊人久久久大香线蕉 | 久久久精品2019免费观看| 久久精品国产WWW456C0M| 久久久老熟女一区二区三区| 久久人人爽人人爽人人片AV东京热| 看全色黄大色大片免费久久久| 亚洲午夜久久久久久久久电影网 | 精品亚洲综合久久中文字幕| 久久婷婷人人澡人人爽人人爱 | 久久本道伊人久久| 久久午夜羞羞影院免费观看| 精品久久久中文字幕人妻| 久久久精品久久久久特色影视| 亚洲综合精品香蕉久久网97| 久久亚洲精品成人av无码网站| 一本色综合网久久| 久久久久久久波多野结衣高潮| 亚洲人成网站999久久久综合 | 国产精品美女久久福利网站| 99热都是精品久久久久久| 激情综合色综合久久综合| 国产综合精品久久亚洲| 久久久久久久久久久免费精品| 国内精品久久久久久久影视麻豆|