• <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)  編輯 收藏 引用 所屬分類: 算法題解
            色狠狠久久综合网| 久久精品国产精品亜洲毛片| 久久亚洲国产成人精品无码区| 久久国产精品无| 亚洲午夜久久久影院| 成人午夜精品久久久久久久小说| 久久久噜噜噜久久中文字幕色伊伊| 国产精品久久久久久久久| 久久精品国产亚洲αv忘忧草| 久久午夜伦鲁片免费无码| 久久无码专区国产精品发布| 久久成人国产精品| 中文无码久久精品| 人人狠狠综合久久亚洲88| 51久久夜色精品国产| 久久99久久99小草精品免视看| 无码人妻久久一区二区三区免费丨 | 久久天天躁狠狠躁夜夜不卡| 国产亚洲精品自在久久| 狠狠色综合网站久久久久久久高清| 久久99国产精品99久久| 波多野结衣AV无码久久一区| 久久99精品久久久久久9蜜桃| 国产精品欧美久久久久天天影视| 色综合久久久久综合体桃花网 | 久久美女人爽女人爽| 精品人妻伦九区久久AAA片69| 性高朝久久久久久久久久| 一级做a爰片久久毛片毛片| 精品久久久久久久久久中文字幕 | 无码任你躁久久久久久| 91精品国产综合久久香蕉| 久久99国产精品久久99| 97久久久精品综合88久久| 久久国产精品成人片免费| 久久超碰97人人做人人爱| 无码AV波多野结衣久久| 久久精品无码专区免费青青| 久久久久久久久无码精品亚洲日韩 | 亚洲级αV无码毛片久久精品| 国产精品久久久久蜜芽|