• <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>
            posts - 33,  comments - 33,  trackbacks - 0
            題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3682
            題目大意:給你一個立方體,要求去掉若干個垂直于xy或xz或yz的柱子后,去掉的總立方塊個數。
            題解:發揮想象力,模擬。
            1.判斷兩兩相交
            例子:
            設柱子的值為(x,y,z),其中用0表示和該軸平行
            柱子A:(x1,y1,0),表示過xy平面的x1,y1點,且垂直于xy平面
            柱子B:(0,y2,z2),表示過yz平面的y2,z2點,且垂直于yz平面
            如果柱子A和柱子B相交,那么必有:y1 == y2
            如A*B中有兩個分量為0,且非0部分兩者相等,則相交,交點為兩者求并(x1,y1==y2,z2)

            2.逐個插入
            那么,根據給出的柱子數,初始移除塊數為n*m,然后按照數據順序逐個插入
            并且判斷有沒有重復,注意每次插入時,判重Hash都是初始的,就是說,以前
            出現過交點的,并不會影響下一次的交點判斷

            代碼:
            #include <stdio.h>
            #include 
            <set>
            #include 
            <vector>
            #include 
            <time.h>
            #include 
            <stdlib.h>
            using namespace std;

            const int N = 1005;
            struct Point
            {
                
            int x;
                
            int y;
                
            int z;
                Point(
            int _x = 0,int _y = 0,int _z = 0):x(_x),y(_y),z(_z){}
            }
            ;

            vector
            <Point> vecX[N];
            vector
            <Point> vecY[N];
            vector
            <Point> vecZ[N];
            set<long long> Set;
            int n,m;
            int cnts[128];

            long long Hash(int x,int y,int z)
            {
                
            long long c = (long long)x*10000*10000;
                c
            *= 10;
                
            return c+ (long long)y * 10000 + (long long)z;
            }


            bool IsCross(Point &_p1,Point& _p2,set<long long>& _Set)
            {
                
            int cx = _p1.x * _p2.x;
                
            int cy = _p1.y * _p2.y;
                
            int cz = _p1.z * _p2.z;
                
            if(((cx == 0)&&(cy == 0))||((cx == 0)&&(cz == 0))||((cy == 0)&&(cz == 0)))
                
            {
                    Point p3;
                    
            if((cx != 0)&&(_p2.x == _p1.x))
                    
            {
                        p3.x 
            = _p1.x;
                        p3.y 
            = _p1.y | _p2.y;
                        p3.z 
            = _p1.z | _p2.z;
                    }

                    
            else if((cy != 0)&&(_p2.y == _p1.y))
                    
            {
                        p3.x 
            = _p1.x | _p2.x;
                        p3.y 
            = _p1.y;
                        p3.z 
            = _p1.z | _p2.z;
                    }

                    
            else if((cz != 0)&&(_p2.z == _p1.z))
                    
            {
                        p3.x 
            = _p1.x | _p2.x;
                        p3.y 
            = _p1.y | _p2.y;
                        p3.z 
            = _p1.z;
                    }

                    
            long long hashCode = Hash(p3.x,p3.y,p3.z);
                    
            if(_Set.find(hashCode) == _Set.end())
                    
            {
                        _Set.insert(hashCode);
                        
            return true;
                    }

                    
            else
                    
            {
                        
            return false;
                    }

                }

                
            return false;
            }


            int Insert()
            {
                Point p1(cnts[
            'X'],cnts['Y'],cnts['Z']);
                
            long long hashCode = Hash(p1.x,p1.y,p1.z);
                
            //判斷出現相同的柱子
                if(Set.find(hashCode) != Set.end())
                    
            return n;
                
            else
                    Set.insert(hashCode);
                
            //對于每一次插入,Hash都是初始的
                set<long long> tmpSet;
                
            int crossCnt = 0;
                
            if(p1.x != 0)
                
            {
                    
            for(int i = 0; i < vecX[p1.x].size(); ++i)
                    
            {
                        
            if(IsCross(p1,vecX[p1.x][i],tmpSet))
                            crossCnt
            ++;
                    }

                    vecX[p1.x].push_back(p1);
                }

                
            if(p1.y != 0)
                
            {
                    
            for(int i = 0; i < vecY[p1.y].size(); ++i)
                    
            {
                        
            if(IsCross(p1,vecY[p1.y][i],tmpSet))
                            crossCnt
            ++;
                    }

                    vecY[p1.y].push_back(p1);
                }

                
            if(p1.z != 0)
                
            {
                    
            for(int i = 0; i < vecZ[p1.z].size(); ++i)
                    
            {
                        
            if(IsCross(p1,vecZ[p1.z][i],tmpSet))
                            crossCnt
            ++;
                    }

                    vecZ[p1.z].push_back(p1);
                }

                
            return crossCnt;
            }


            void Test()
            {
                scanf(
            "%d %d\n",&n,&m);
                
            for(int i = 0; i < N; ++i)
                
            {
                    vecX[i].clear();
                    vecY[i].clear();
                    vecZ[i].clear();
                }

                Set.clear();
                
            char ch1,ch2;
                
            int d1,d2;
                
            int all = n*m;
                
            for(int i = 0; i < m; ++i)
                
            {
                    cnts[
            'X'= cnts['Y'= cnts['Z'= 0;
                    
            //getchar();
                    scanf("%c=%d,%c=%d\n",&ch1,&d1,&ch2,&d2);
                    cnts[ch1] 
            = d1;
                    cnts[ch2] 
            = d2;
                    all 
            -= Insert();
                }

                printf(
            "%d\n",all);
            }



            int main()
            {
                
            int testcase = 0;
                scanf(
            "%d",&testcase);
                
            for(int i = 0; i < testcase; ++i)
                    Test();
                
            return 0;
            }
            posted on 2010-11-10 17:10 bennycen 閱讀(469) 評論(1)  編輯 收藏 引用 所屬分類: 算法題解
            久久电影网2021| 久久精品人人做人人爽电影蜜月| 少妇人妻88久久中文字幕| 亚洲国产二区三区久久| 伊人久久综在合线亚洲2019| 99久久精品免费观看国产| 亚洲欧美国产精品专区久久| 伊人久久大香线蕉亚洲五月天| 久久综合九色综合网站| 欧美大战日韩91综合一区婷婷久久青草| 亚洲欧美精品一区久久中文字幕| 久久精品夜夜夜夜夜久久| 久久亚洲AV无码西西人体| 精品熟女少妇a∨免费久久| 久久91这里精品国产2020| 久久久久AV综合网成人 | 少妇久久久久久久久久| 久久国产乱子精品免费女| 久久久久久久精品妇女99| 国产精品久久久久久久久久免费| 亚洲AV无码久久精品成人| 国内精品久久久久久久亚洲| 久久综合综合久久综合| 久久强奷乱码老熟女网站| 久久国产精品一区| 久久精品九九亚洲精品天堂| 亚洲精品无码久久久久去q | 看全色黄大色大片免费久久久| 亚洲αv久久久噜噜噜噜噜| 国内精品久久久久久中文字幕| 久久96国产精品久久久| 久久精品人人槡人妻人人玩AV | 国产精品热久久无码av| 久久99国产精品99久久| 日本久久久久亚洲中字幕| 99久久精品免费看国产一区二区三区| 国产激情久久久久影院老熟女免费| 久久91精品国产91久久麻豆| 久久国产精品一区二区| 伊人久久大香线蕉影院95| 狠狠综合久久综合中文88|