• <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>

            學習心得(code)

            superlong@CoreCoder

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              74 Posts :: 0 Stories :: 5 Comments :: 0 Trackbacks

            公告

            文字可能放在http://blog.csdn.net/superlong100,此處存放代碼

            常用鏈接

            留言簿(4)

            我參與的團隊

            搜索

            •  

            最新隨筆

            最新評論

            • 1.?re: Poj 1279
            • 對于一個凹多邊形用叉積計算面積 后能根據結果的正負來判斷給的點集的時針方向?
            • --bsshanghai
            • 2.?re: Poj 3691
            • 你寫的這個get_fail() 好像并是真正的get_fail,也是說fail指向的串并不是當前結點的子串。為什么要這樣弄呢?
            • --acmer1183
            • 3.?re: HDU2295[未登錄]
            • 這個是IDA* 也就是迭代加深@ylfdrib
            • --superlong
            • 4.?re: HDU2295
            • 評論內容較長,點擊標題查看
            • --ylfdrib
            • 5.?re: HOJ 11482
            • 呵呵..把代碼發在這里很不錯..以后我也試試...百度的編輯器太爛了....
            • --csuft1

            閱讀排行榜

            評論排行榜

            #include <stdio.h>
            #define LOOP(a,b,c,d) for(a=b;a<c;a+=d)
            #define L(a) LOOP(a,0,8,1)
            #define ENEMY(a,b) ((a-'a')*(b-'a')<0&&a!='.'&&b!='.')
            #define FRIEND(a,b) ((a-'a')*(b-'a')>0&&a!='.'&&b!='.')
            int mdir[16][2]={0,1,-1,1,-1,0,-1,-10,-1,1,-1,1,0,1,1,//相鄰移動8個方向 
                             -1,2,-2,1,-2,-1,-1,-2,1,-2,2,-1,2,1,1,2};//馬步移動8個方向 
            int md[5][4]={0,8,1,2//king               md[0]-md[1]:當前棋子的移動數組的下標范圍 
                          0,8,1,8//queen              md[2]      :移動數組的選取間隔(1->八個方向, 2->四個方向) 
                          0,8,2,8//rook               md[3]      :遍歷當前棋子一次操作可以攻擊的范圍需要進行移動的次數 
                          1,8,2,8//bishop
                          8,16,1,2 //knight
                        };
            int KX,KY,KADD,KAT[8][2],KAL,MBLE,ATTACK[8][8],MOVE[8][8],ESC,BLE;
            char map[8][10];
            char BW[2]; // 當前選手 
            int trs(char c){
                
            if(c<'a')c+='a'-'A';//大寫轉小寫 
                if(c=='k')return 0;
                
            if(c=='q')return 1;
                
            if(c=='r')return 2;
                
            if(c=='b')return 3;
                
            if(c=='n')return 4;
                
            return -1;
                
            /*
                Rook    車 2 
                Bishop    象 3
                Queen    后 1
                Knight    馬 4
                King    王 0
                
            */
            }
            void InitMap(){
                
            int i,j;
                L(i)L(j)ATTACK[i][j]
            =MOVE[i][j]=0;MBLE=KADD=ESC=BLE=0;
                scanf(
            "%s",BW);
                L(i)scanf(
            "%s",map[i]);
                L(i)L(j)
            if(trs(map[i][j])==0&&FRIEND(map[i][j],BW[0])){
                    KX
            =i;KY=j;i=j=8;
                }
            }
            int StepMove(int x,int y,int d,int l,int *m,int *n){
                
            *m=x+mdir[d][0]*l;*n=y+mdir[d][1]*l;
                
            if(*m<0||*m>7||*n<0||*n>7)return -1;
                
            if(map[*m][*n]=='.')return 0;
                
            return 1;
            }
            void ATT(char c,int x,int y){
                
            int d,l,r,s,m,n,i,sx,sy;
                r
            =trs(c); //當前敵人的類型 
                LOOP(d,md[r][0],md[r][1],md[r][2]){ 
                    LOOP(l,
            1,md[r][3],1){
                        s
            =StepMove(x,y,d,l,&m,&n);
                        
            if(s>=0)ATTACK[m][n]++;
                        
            if(s)break;             //遇到一個非空的位置或者出界就停止 
                    }
                    
            if(s<=0||FRIEND(map[m][n],c))continue;//當前棋子木有遇到其他棋子或者遇到的棋子是友方單位 
                    if(KX==m&&KY==n){                     //如果是遇到了我方的王 
                        KADD++;KAL=l;                     //我方王被攻擊次數+1 
                        if(KADD==1)                       //如果問方王只是被攻擊一次 
                            LOOP(i,0,KAL,1){              //記錄攻擊王的這條線路 KAT 
                                KAT[i][0]=x+i*mdir[d][0];
                                KAT[i][
            1]=y+i*mdir[d][0];
                            }
                        
            continue;
                    }
                    
            if(r==0||r==4)continue//如果王和馬走到(m,n)那么移開自己在(m,n)上的棋子不會對王造成威脅 
                    LOOP(i,1,8,1)           //假設移開在(m,n)的本方棋子使得王被攻擊則標記該位置為不可動(-1) 
                        if(s=StepMove(m,n,d,i,&sx,&sy))break;
                        
            if(KX==sx&&KY==sy)MOVE[m][n]=-1;
                }
            }
            void BLOCK(char c,int x,int y){
                
            int d,l,r,s,m,n;
                r
            =trs(c);if(r==0)return;//枚舉不是王且能移動的的友方單位 
                LOOP(d,md[r][0],md[r][1],md[r][2]){
                    LOOP(l,
            1,md[r][3],1){
                        s
            =StepMove(x,y,d,l,&m,&n);
                        
            if(s)break;
                        
            else {MOVE[m][n]++;MBLE++;}
                    }
                    
            if(s==1&&ENEMY(map[m][n],c)){
                        MBLE
            ++;MOVE[m][n]++;
                    }
                }
            }
            int main(){
                
            int i,j,t,x,y;
                scanf(
            "%d",&t);
                
            while(t--){
                    InitMap();
            //讀入圖 以及初始化各個數組 
                    L(i)L(j)if(ENEMY(map[i][j],BW[0]))ATT(map[i][j],i,j);
                    
            /*
                        做了兩張表ATT和MOVE
                        ATT表示敵方能攻擊的所有點
                        MOVE[x][y] = -1 表示本方在(x,y)處的棋子無法移動
                        KADD記錄王被多少個敵方單位攻擊到 
                    
            */ 
                    L(i)L(j)
            if(FRIEND(map[i][j],BW[0])&&MOVE[i][j]!=-1)BLOCK(map[i][j],i,j);
                    
                    L(i){
                        x
            =KX+mdir[i][0];y=KY+mdir[i][1];if(x<0||x>7||y<0||y>7)continue;
                        
            if(ATTACK[x][y]==0&&(map[x][y]=='.'||ENEMY(map[x][y],BW[0]))){ESC++;break;}
                    }
            //如果王走一步可以移動且不受攻擊則ESC++ 
                    
                    
            if(KADD==1)LOOP(i,0,KAL,1)if(MOVE[KAT[i][0]][KAT[i][1]]){BLE=1;break;}
                    printf(
            "%s IS ",BW[0]=='B'?"BLACK":"WHITE");
                    
            if(KADD==0&&(ESC||MBLE))printf("SAFE\n");
                    
            else if(KADD&&(ESC||BLE))printf("CHECKED\n");
                    
            else printf("CHECKMATED\n");
                }
                
            return 0;
            }


            題意是給定一個棋盤和誰現在出手,問他是否安全或者被將死或者被將軍

            posted on 2010-08-06 15:57 superlong 閱讀(224) 評論(0)  編輯 收藏 引用
            老色鬼久久亚洲AV综合| 亚洲国产天堂久久久久久| 欧美一区二区三区久久综合| 国产精品美女久久久久| 久久久久亚洲爆乳少妇无| 无码人妻精品一区二区三区久久久| 久久99热国产这有精品| 伊人久久精品影院| 韩国三级大全久久网站| 无码人妻久久一区二区三区蜜桃| 97精品久久天干天天天按摩| 中文精品99久久国产| 久久久国产精品福利免费 | 久久精品国产欧美日韩99热| 人妻精品久久无码区| 久久性生大片免费观看性| 久久99国产综合精品女同| 三级三级久久三级久久| 久久99精品国产麻豆不卡| 99热成人精品热久久669| 一本久久知道综合久久| 亚洲国产成人久久综合区| 国产精品99久久精品爆乳| 国产精品久久久久无码av| 久久精品中文闷骚内射| 久久人做人爽一区二区三区| 亚洲精品无码久久毛片| 久久人人超碰精品CAOPOREN | 日本精品久久久久影院日本 | 国产精品久久久久久福利漫画 | 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 久久久久亚洲Av无码专| 狠狠色丁香久久婷婷综合| 人妻无码精品久久亚瑟影视 | 国产亚洲精久久久久久无码| 色综合久久久久无码专区| 亚洲国产精品18久久久久久| 欧美牲交A欧牲交aⅴ久久| 亚洲va中文字幕无码久久不卡| 亚洲AV无码久久| 久久综合丁香激情久久|