• <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)  編輯 收藏 引用
            久久久一本精品99久久精品88| 久久婷婷五月综合97色一本一本| 久久久久人妻精品一区二区三区| 久久久久国产精品嫩草影院 | 欧美一级久久久久久久大| 久久精品国产91久久麻豆自制 | 国产午夜精品久久久久九九| 久久精品国产亚洲av麻豆小说| 77777亚洲午夜久久多人| 国产精品久久久久久久app| 99久久综合国产精品免费| 少妇人妻综合久久中文字幕| 精品久久久久久中文字幕大豆网| 久久久久亚洲av成人网人人软件 | 亚洲乱码精品久久久久..| 亚洲AV无一区二区三区久久| 99蜜桃臀久久久欧美精品网站| 色婷婷综合久久久中文字幕| 久久亚洲春色中文字幕久久久| 久久超乳爆乳中文字幕| 久久福利青草精品资源站| 国产三级观看久久| 欧美亚洲国产精品久久久久| 亚洲中文字幕无码久久精品1| 久久久久人妻一区精品性色av| 精品久久一区二区三区| 久久精品成人欧美大片| 亚洲精品美女久久久久99小说| 伊人久久大香线蕉av一区| 欧美大香线蕉线伊人久久| 国产成人精品久久免费动漫| 狠狠人妻久久久久久综合| 久久夜色精品国产噜噜亚洲a| 久久久久AV综合网成人| 久久艹国产| 中文字幕乱码久久午夜| 99久久精品毛片免费播放| 久久久久黑人强伦姧人妻| 亚洲午夜久久久久久久久电影网| 91精品国产综合久久婷婷| 香蕉久久夜色精品国产尤物|