• <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 閱讀(223) 評論(0)  編輯 收藏 引用
            精品国产一区二区三区久久久狼 | 国产精品18久久久久久vr| 18禁黄久久久AAA片| 久久丫精品国产亚洲av不卡| 精品久久无码中文字幕| 久久久精品视频免费观看| 久久国产免费直播| 久久国产综合精品五月天| 亚洲午夜久久久久久久久久| 久久线看观看精品香蕉国产| 狠狠色丁香婷婷久久综合五月| 久久精品一本到99热免费| 久久久久99精品成人片牛牛影视| 国产69精品久久久久9999APGF| 国产精品九九久久精品女同亚洲欧美日韩综合区 | 久久久久久亚洲精品成人 | 热久久最新网站获取| 久久久久久久综合日本亚洲| 国产免费久久精品99re丫y| 99热成人精品免费久久| 久久久无码精品亚洲日韩按摩| 老司机午夜网站国内精品久久久久久久久 | 亚洲乱码日产精品a级毛片久久 | 青青青国产精品国产精品久久久久| 久久人人爽人人爽人人片AV麻烦 | 99久久精品费精品国产一区二区| 亚洲精品国产综合久久一线| 91精品日韩人妻无码久久不卡| 激情伊人五月天久久综合| 亚洲狠狠婷婷综合久久久久| 麻豆av久久av盛宴av| 亚洲精品无码久久久久AV麻豆| 欧美国产成人久久精品| 久久久亚洲精品蜜桃臀| 久久精品一区二区影院| 久久综合成人网| 一级女性全黄久久生活片免费| 亚洲欧美国产日韩综合久久| 97视频久久久| 久久青青草原亚洲av无码app | 亚洲精品乱码久久久久久蜜桃图片|