• <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 閱讀(478) 評論(1)  編輯 收藏 引用 所屬分類: 算法題解
            日韩中文久久| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 人妻精品久久久久中文字幕一冢本| 久久WWW免费人成一看片| 91久久精品91久久性色| 久久人妻少妇嫩草AV蜜桃| 99久久99久久精品国产片果冻| 91精品国产综合久久久久久| 亚洲日韩欧美一区久久久久我| 国产精品久久久久9999| 伊人精品久久久久7777| 99久久免费国产精品热| 久久无码AV中文出轨人妻| 9999国产精品欧美久久久久久| 国内精品人妻无码久久久影院导航| 久久精品无码一区二区三区| 久久久亚洲AV波多野结衣| 成人国内精品久久久久影院VR| 亚洲精品乱码久久久久久久久久久久 | 99久久精品免费看国产| 亚洲va久久久噜噜噜久久| 国内精品久久久久久久涩爱| 中文字幕人妻色偷偷久久| 久久人人爽人人爽人人片AV麻豆 | 一日本道伊人久久综合影| 久久国产精品成人免费| 亚洲人成网亚洲欧洲无码久久| 精品久久久无码中文字幕| 久久国产乱子精品免费女| 久久婷婷五月综合97色一本一本| 青青草原综合久久大伊人| 久久午夜夜伦鲁鲁片免费无码影视 | 久久精品无码一区二区日韩AV| 国产一级持黄大片99久久| 精品永久久福利一区二区| 亚洲色大成网站www久久九| 无码任你躁久久久久久老妇App| 亚洲国产成人久久综合一区77 | 国产精品美女久久久久AV福利| 蜜桃麻豆www久久| 狠狠久久综合伊人不卡|