亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? huarongdaojavashixian.txt

?? 華容道的java實現
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
//---------------------------------------------------------------------------

#include <stdio.h>

#include <conio.h>

//---------------------------------------------------------------------------

//--以下定義一些常數或參數--

//---------------------------------------------------------------------------

//棋盤表示使用char一維數組,例:char q[20];

//用1-15表示各棋子,空位用0表示,兵1-4,豎將5-9,橫將10-14,大王15

//大王只能1個,將必須5個(橫豎合計),兵必須為4個

const char U[]="ABBBBCCCCCHHHHHM";; //棋子類型表

const COL[20]={0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3};   //列號表

const ROW[20]={0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4};   //行號表

const WQ2[13]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096}; //二進制位權表(12個)

//---------------------------------------------------------------------------

//--以下定義幾函數--

//---------------------------------------------------------------------------

//以下define用于棋盤復制,不要用環循,實地址直接引用要快8倍

#define qpcpy(q1,q2) {/*復制棋盤*/\

  int *ls1=(int*)q1,*ls2=(int*)q2;\

  ls1[0]=ls2[0],ls1[1]=ls2[1],ls1[2]=ls2[2],ls1[3]=ls2[3],ls1[4]=ls2[4];\

}

//memset(JD,0,Bm.bmtot);

void qkmem(void *ps,int n){ //內存塊置0

  register int *p=(int*)ps,*p2=p+n/4;

  while(p<p2) *p++=0;

  char *p3=(char *)p,*p4=(char *)ps+n;

  while(p3<p4) *p3++=0;

}

void prt(char *q){ //打印棋盤

  int i,j;

  for(i=0;i<5;i++){

    for(j=0;j<4;j++) printf("%2d ",q[i*4+j]);

    printf("\r\n");

  }

  printf("\r\n");

}

//---------------------------------------------------------------------------

//--以下是搜索算法之一(解決編碼問題)--

//---------------------------------------------------------------------------

class PmBm{ //盤面編碼類

 public:

 short int *Hz,*Sz,*Bz;  //豎將,橫將,小兵,組合序號表

 int *Hw,*Sw,Mw[12]; //權值表:橫條,豎條,大王

 int bmtot;

 PmBm(char *q){//初始化編碼表

   Hz=new short int[4096*3]; Sz=Hz+4096; Bz=Hz+4096*2;

   Hw =new int[792*2];  Sw=Hw+792;  //C12取5=792

   int i,j,k;

   int Hn=0,Bn=0,Sn=0; //各類子數目,大王默認為1不用計數

   for(i=0;i<20;i++){   //計算各種棋子的個數

     if(U[q[i]]=='B') Bn++;

     if(U[q[i]]=='H') Hn++;

     if(U[q[i]]=='C') Sn++;

   }

   Hn/=2,Sn/=2;

   int Hmax=WQ2[11],Smax=WQ2[12-Hn*2],Bmax=WQ2[16-(Hn+Sn)*2]; //各種子的最大二進位數

   int Hx=0,Sx=0,Bx=0; //各種棋子組合的最大序號

   for(i=0;i<4096;i++){  //初始化組合序號表

     for(j=0,k=0;j<12;j++) if(i&WQ2[j]) k++; //計算1的個數

     if(k==Hn&&i<Hmax) Hz[i]=Hx++;

     if(k==Sn&&i<Smax) Sz[i]=Sx++;

     if(k==Bn&&i<Bmax) Bz[i]=Bx++;

   }

   int Sq=Bx,Hq=Bx*Sx,Mq=Bx*Sx*Hx; //豎將位權,橫將位權,王位權

   for(i=0;i<12;i++) Mw[i]=i*Mq; //初始化大王權值表

   for(i=0;i<Hx;i++) Hw[i]=i*Hq; //初始化橫將權值表

   for(i=0;i<Sx;i++) Sw[i]=i*Sq; //初始化豎將權值表

   bmtot=Mq*12;

 }

 ~PmBm(){ delete[] Hz,Hw; }

 int BM(char *q){ //盤面編碼

   int Bb=0,Bd=-1; //空位序號記錄器

   int Sb=0,Sd=-1; //豎條序號記錄器

   int Hb=0,Hd=-1; //橫條序號記錄器

   int Mb;         //大王序號記錄器

   char c,lx,f[16]={0};   //其中f[]標記幾個棋子是否已確定位置序號

   int i;

   for(i=0;i<20;i++){

     c=q[i],lx=U[c]; //當前的值

     if(lx=='M') { //大王定序

       if(!f[c]) Mb=i-ROW[i],f[c]=1;

       continue;

     }

     if(COL[i]<3&&U[q[i+1]]<='H') Hd++; //橫條位置序號(編號)

     if(lx=='H') {//橫將定序,轉為二進制進行詢址得Hb

       if(!f[c]) Hb+=WQ2[Hd],f[c]=1;

       continue;

     }

     if(ROW[i]<4&&U[q[i+4]]<='C') Sd++; //豎將位置序號(編號)

     if(lx=='C') { //豎條定序,轉為二進制進行詢址得Sb

       if(!f[c]) Sb+=WQ2[Sd],f[c]=1;

       continue;

     }

     if(lx<='B') Bd++;  //小兵位置序號(編號)

     if(lx=='B') Bb+=WQ2[Bd]; //小兵定序,轉為二進制進行詢址得Bb

   }

   //Hb,Sb,Bb為組合序號,"橫刀立馬"最大值為小兵C(6,4)-1=15-1,豎條C(10,4)-1=210-1

   Bb=Bz[Bb],Sb=Sz[Sb],Hb=Hz[Hb];//詢址后得得Bb,Sb,Hb組合序號

   return Bb+Sw[Sb]+Hw[Hb]+Mw[Mb]; //用位權編碼,其中Bb的位權為1

 }

 int dcBM(char *q){ //按左右對稱規則考查棋盤,對其編碼

   char i,q2[20];

   for(i=0;i<20;i+=4) q2[i]=q[i+3],q2[i+1]=q[i+2],q2[i+2]=q[i+1],q2[i+3]=q[i];

   return BM(q2);

 }

};

//---------------------------------------------------------------------------

//以下定義搜索過程使用的核心數據結構

//---------------------------------------------------------------------------

struct PMZB{ //盤面走步集結構

  char s[10],d[10];//原位置,目標位置,最多只會有10步

  int n;           //總步數

};

//以下是走法生成器函數

#define kgpd(i)  (i==k1||i==k2) //空格判斷宏

#define kgpd1(i) (i==k1&&h==1)  //豎聯空格判斷宏

#define kgpd2(i) (i==k1&&h==2)  //橫聯空格判斷宏

#define zin(des) z->s[z->n]=i,z->d[z->n]=des,z->n++ //保存步法宏

void zbFX(char *q,PMZB *z){ //分析當前可能的步法,并將所有可能的步法保存在z中

  int i,col,k1=0,k2=0,h=0; //i,列,空格1位置,空格2位置,h為兩空格的聯合類型

  char c,lx,f[16]={0}; //f[]記錄已判斷過的棋字

  z->n=0; //計步復位

 

  for(i=0;i<20;i++){

    if(!q[i]) k1=k2,k2=i; //查空格的位置

  }

  if(k1+4==k2) h=1;            //空格豎聯合

  if(k1+1==k2&&COL[k1]<3) h=2; //空格橫聯合

  for(i=0;i<20;i++){

    c=q[i],lx=U[c],col=COL[i];

    if(f[c]) continue;

    switch(lx){

     case 'M': //曹操可能的走步

       if(kgpd2(i+8))        zin(i+4);  //向下

       if(kgpd2(i-4))        zin(i-4);  //向上

       if(col<2&&kgpd1(i+2)) zin(i+1);  //向右

       if(col  &&kgpd1(i-1)) zin(i-1);  //向左

       f[c]=1; break;

     case 'H': //關羽可能的走步

       if(kgpd2(i+4))        zin(i+4);  //向下

       if(kgpd2(i-4))        zin(i-4);  //向上

       if(col<2&&kgpd(i+2)) {zin(i+1); if(h==2) zin(k1); }  //向右

       if(col  &&kgpd(i-1)) {zin(i-1); if(h==2) zin(k1); }  //向左

       f[c]=1; break;

     case 'C': //張飛,馬超,趙云,黃忠可能的走步

       if(kgpd(i+8))        {zin(i+4); if(h==1) zin(k1); }  //向下

       if(kgpd(i-4))        {zin(i-4); if(h==1) zin(k1); }  //向上

       if(col<3&&kgpd1(i+1)) zin(i+1);  //向右

       if(col  &&kgpd1(i-1)) zin(i-1);  //向左

       f[c]=1; break;

     case 'B': //小兵可能的走步

       if(kgpd(i+4))        { if(h){zin(k1);zin(k2);} else zin(i+4); } //向上

       if(kgpd(i-4))        { if(h){zin(k1);zin(k2);} else zin(i-4); } //向下

       if(col<3&&kgpd(i+1)) { if(h){zin(k1);zin(k2);} else zin(i+1); } //向右

       if(col  &&kgpd(i-1)) { if(h){zin(k1);zin(k2);} else zin(i-1); } //向右

       break;

    }

  }

}

void zb(char *q,int s,int d){ //走一步函數

  char c=q[s],lx=U[c];

  switch(lx){

    case 'B': {q[s]=0;        q[d]=c;          break; }

    case 'C': {q[s]=q[s+4]=0; q[d]=q[d+4]=c;   break; }

    case 'H': {q[s]=q[s+1]=0; q[d]=q[d+1]=c;   break; }

    case 'M': {q[s]=q[s+1]=q[s+4]=q[s+5]=0; q[d]=q[d+1]=q[d+4]=q[d+5]=c; break; }

  }

}

//---------------------------------------------------------------------------

//--以下是搜索過程(廣度優先)--

//---------------------------------------------------------------------------

class ZBD{ //走步隊

 public:

 char (*z)[20];     //隊列

 PMZB zbj;

 int n;       //隊長度

 int *hs,*hss;//回溯用的指針及棋子

 int m,cur;   //隊頭及隊頭內步集游標,用于廣度搜索

 int max;     //最大隊長

 int *res,ren;//結果

 ZBD(int k){ z=new char[k][20]; hs=new int[k*2+500]; hss=hs+k; res=hss+k; max=k; reset(); }

 ~ZBD(){ delete[] z; delete[] hs;}

 void reset() { n=0; m=0,cur=-1; hss[n]=-1; ren=0;}

 int zbcd(char *q){ //走步出隊

   if(cur==-1) zbFX(z[m],&zbj);

   cur++; if(cur>=zbj.n) {m++,cur=-1; return 1;} //步集游標控制

   if(hss[m]==zbj.s[cur]) return 1;//和上次移動同一個棋子時不搜索,可提速20%左右

   qpcpy(q,z[m]); zb(q,zbj.s[cur],zbj.d[cur]); //走步后產生新節點,結果放在q中

   return 0;

 }

 void zbrd(char *q){ //走步入隊

   if(n>=max) { printf("隊溢出.\r\n"); return; }

   qpcpy(z[n],q); //出隊

   if(cur>=0) hss[n]=zbj.d[cur]; //記錄移動的子(用于回溯)

   hs[n++]=m; //記錄回溯點

 }

 void hui(int cs){ //參數:層數

   int k=cs-2; ren=cs,res[cs-1]=m;

   for(;k>=0;k--) res[k]=hs[res[k+1]]; //回溯

 }

 char* getre(int n){ return z[res[n]];} //取第n步盤面

 

};

//--廣度優先--

void bfs(char *q,int dep){ //參數為棋盤及搜索最大深度

  int i,j,k,bm,v; //ok表示是否找到

  int js=0,js2=0;

  PmBm Bm(q); //建立編碼器

  char *JD=new char[Bm.bmtot]; qkmem(JD,Bm.bmtot); //建立節點數組

  ZBD Z=ZBD(Bm.bmtot/10); //建立隊

  for(Z.zbrd(q),i=1;i<=dep;i++){ //一層一層的搜索

    k=Z.n;

    //printf("本層%d %d\r\n",i,k-Z.m);

    while(Z.m<k){ //廣度優先

      if(Z.zbcd(q)) continue;     //返回1說明是步集出隊,不是步出隊

      js++;

      if(q[17]==15&&q[18]==15) { Z.hui(i); goto end; }//大王出來了

      if(i==dep) continue; //到了最后一層可以不再入隊了

      bm=Bm.BM(q);

      if(!JD[bm]){

        js2++ ;  //js搜索總次數計數和js2遍歷的實結點個數

        JD[bm]=1, JD[Bm.dcBM(q)]=1;//對節點及其對稱點編碼

        Z.zbrd(q);

      }

    }

  }

  end:delete JD;

  printf("共遍歷%d個節點,其中實結點%d.隊長%d,搜索層數%d,任意鍵...\r\n",js,js2,Z.n,Z.ren);

  if(!Z.ren) { printf("此局%d步內無解",dep); return; }

  for(i=0;i<Z.ren;i++) { getch();clrscr(); prt(Z.getre(i)); } //輸出結果

}

//---------------------------------------------------------------------------

void main(int argc, char* argv[])

{//華榮道棋盤參數,須留二個空位,兵4個1-4,豎將5-9,橫將10-14,大王15(1個)

 char qp[20]={

   6,15,15,7,

   6,15,15,7,

   8,11,11,5,

   8,3, 4, 5,

   2,0, 0, 1

 };

 int i,dep=81;

 bfs(qp,dep);

 getch();

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人h版在线观看| 91精品国产色综合久久久蜜香臀| 欧美日韩不卡一区二区| 欧美成人精品1314www| 亚洲日本在线a| 精品一区二区三区av| 在线欧美一区二区| 国产精品色眯眯| 国内精品免费**视频| 欧美日韩免费观看一区三区| 国产精品国产三级国产aⅴ入口 | 亚洲精品成人在线| 国产乱码精品1区2区3区| 欧美片网站yy| 亚洲黄色小视频| 99在线热播精品免费| 久久综合狠狠综合| 久久疯狂做爰流白浆xx| 欧美日韩一本到| 一区二区三区四区激情| www.亚洲激情.com| 国产精品美女久久久久久| 国产精品综合久久| 久久午夜免费电影| 国产乱妇无码大片在线观看| 日韩三级电影网址| 久久99精品国产| 精品国产一区二区三区久久影院| 捆绑变态av一区二区三区| 欧美高清精品3d| 婷婷综合五月天| 欧美一区二区三级| 免费视频最近日韩| 精品对白一区国产伦| 久久99精品久久只有精品| 制服丝袜亚洲播放| 久久99精品久久久久婷婷| 精品久久久久99| 国产主播一区二区三区| 久久久久99精品一区| 国产精品自拍在线| 国产精品乱码一区二三区小蝌蚪| 成人免费va视频| 亚洲嫩草精品久久| 欧美日韩国产免费| 久久成人免费电影| 国产午夜亚洲精品午夜鲁丝片| 久久99国产乱子伦精品免费| 久久久99精品久久| 92精品国产成人观看免费| 亚洲精品视频在线观看网站| 欧美影院午夜播放| 久久精品久久精品| 日本一区二区在线不卡| 91蝌蚪porny九色| 日韩极品在线观看| 国产日产欧美一区二区三区 | 久久成人免费日本黄色| 欧美激情一区三区| 欧美性大战久久| 精一区二区三区| 国产精品久久久久久久裸模| 欧美三级资源在线| 国产一区二区91| 亚洲乱码精品一二三四区日韩在线| 欧美另类z0zxhd电影| 国产一区免费电影| 亚洲国产一二三| 久久久久国色av免费看影院| 在线国产电影不卡| 国产精品一区二区在线观看网站| 一区二区三区资源| 久久综合久久鬼色| 欧美男男青年gay1069videost| 国产自产2019最新不卡| 亚洲午夜久久久久久久久久久| 久久久久综合网| 欧美日韩国产系列| av男人天堂一区| 久草精品在线观看| 午夜精品免费在线| 亚洲视频电影在线| 久久久久国产精品厨房| 欧美精品电影在线播放| 91免费在线视频观看| 激情综合色综合久久| 天天av天天翘天天综合网色鬼国产 | 一区二区三区精品| 久久精品视频在线看| 7777精品伊人久久久大香线蕉最新版| 国产一区二区三区四| 麻豆极品一区二区三区| 亚洲综合区在线| 国产精品久久午夜夜伦鲁鲁| 精品国产一区二区三区久久久蜜月 | 欧美国产一区二区在线观看| 欧美一区二区三区四区五区 | 久久蜜桃香蕉精品一区二区三区| 欧美色爱综合网| 一本到高清视频免费精品| 成人在线视频一区二区| 激情另类小说区图片区视频区| 天天综合日日夜夜精品| 亚洲综合一区在线| 亚洲麻豆国产自偷在线| 国产精品国产a| 国产精品三级电影| 国产亚洲美州欧州综合国 | 欧美日韩一区二区三区不卡| 一本色道久久综合狠狠躁的推荐| 成人激情午夜影院| 懂色中文一区二区在线播放| 国产精品一区在线观看你懂的| 国模无码大尺度一区二区三区| 美女www一区二区| 久久av老司机精品网站导航| 男男gaygay亚洲| 久久99久久久久久久久久久| 麻豆91免费观看| 国内精品久久久久影院色| 国产美女久久久久| 成人做爰69片免费看网站| www..com久久爱| 91成人国产精品| 69久久夜色精品国产69蝌蚪网| 欧美一级高清大全免费观看| 精品久久久久久综合日本欧美| 久久嫩草精品久久久精品| 国产精品午夜在线| 亚洲欧美激情小说另类| 亚洲大片在线观看| 老鸭窝一区二区久久精品| 国产精华液一区二区三区| 不卡一区中文字幕| 日本丶国产丶欧美色综合| 在线观看亚洲a| 欧美一级爆毛片| 国产欧美一二三区| 亚洲自拍偷拍欧美| 日本不卡免费在线视频| 国产不卡在线视频| 91在线视频网址| 欧美三级在线看| 久久中文字幕电影| 亚洲视频免费看| 日韩国产一区二| 国产成人h网站| 91免费观看国产| 日韩欧美国产三级电影视频| 国产精品毛片a∨一区二区三区| 亚洲精品欧美专区| 美女国产一区二区| 色综合色狠狠天天综合色| 日韩欧美一区二区视频| 国产精品传媒在线| 日韩精品一级中文字幕精品视频免费观看 | 欧美一级xxx| 亚洲欧洲韩国日本视频| 精品一区二区三区免费毛片爱| 不卡的电视剧免费网站有什么| 欧美精品国产精品| 亚洲欧美综合另类在线卡通| 日本强好片久久久久久aaa| 成人av先锋影音| 日韩亚洲电影在线| 亚洲乱码国产乱码精品精可以看 | 欧美色图12p| 国产欧美精品区一区二区三区| 亚洲国产精品一区二区尤物区| 国产在线精品免费av| 欧美三区免费完整视频在线观看| 欧美精品一区二| 亚洲综合在线视频| 国产99久久久久| 日韩视频123| 天堂在线亚洲视频| 色拍拍在线精品视频8848| 国产网站一区二区| 久久精品国产精品亚洲综合| 91国产免费观看| 亚洲天堂免费在线观看视频| 国产一区91精品张津瑜| 日韩免费福利电影在线观看| 一区二区三区欧美视频| 色一情一伦一子一伦一区| 国产精品免费久久| 国产精品一二一区| xnxx国产精品| 久久精品国产一区二区| 777亚洲妇女| 日韩综合在线视频| 欧美色倩网站大全免费| 亚洲免费观看高清完整版在线 | 欧美一级搡bbbb搡bbbb| 亚洲国产一区视频| 欧美日韩国产一级二级| 亚洲狠狠爱一区二区三区| 91国在线观看| 亚洲一二三四在线观看| 在线免费一区三区|