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

            對三角形坐標(biāo)的表示上采用了如下的表示法:

                                                                             
            以這種方式來表示整個六邊形上的三角形(圖畫的比較省略。。因?yàn)槲抑粫卯媹D。。。。)

            這題主要的難點(diǎ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 閱讀(1404) 評論(0)  編輯 收藏 引用

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产精品99久久久久久宅男| 久久精品视频一| 久久精品无码一区二区三区日韩 | 久久久一本精品99久久精品88| 青青青青久久精品国产| 久久99精品国产| 成人a毛片久久免费播放| 国产亚洲婷婷香蕉久久精品| 色综合久久久久久久久五月| 亚洲精品美女久久777777| 久久久久久久精品妇女99| 久久亚洲sm情趣捆绑调教| 波多野结衣久久精品| 久久精品一区二区三区AV| 区久久AAA片69亚洲| 五月丁香综合激情六月久久| 亚洲AV日韩AV永久无码久久| 久久国产热精品波多野结衣AV| 久久91精品国产91久久麻豆| 亚洲国产精品人久久| 人妻少妇精品久久| 狠狠色丁香久久婷婷综合蜜芽五月 | 久久精品亚洲乱码伦伦中文 | 亚洲av日韩精品久久久久久a| 久久久av波多野一区二区| 久久国产精品99久久久久久老狼 | 国产精品va久久久久久久| 一本一道久久a久久精品综合| 婷婷五月深深久久精品| 国产精品成人99久久久久91gav| 久久精品不卡| 国产精品天天影视久久综合网| 国产精品99久久久久久猫咪| 一本久久a久久精品vr综合| 久久国产精品成人免费 | 久久婷婷色香五月综合激情| 久久亚洲精品人成综合网| 国产精品午夜久久| 久久久久亚洲AV无码专区体验| 久久精品国产亚洲Aⅴ香蕉| 国内精品久久久久久99|