<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      馬踏棋盤算法

      馬踏棋盤算法(騎士周游問題)

      定義:將馬隨機(jī)放在國際象棋的8×8棋盤Board[0~7][0~7]的某個方格中,馬按走棋規(guī)則進(jìn)行移動。要求每個方格只進(jìn)入一次,走遍棋盤上全部64個方格。

      算法:如圖:

      用一個二維數(shù)組來存放棋盤,假設(shè)馬兒的坐標(biāo)為(x,y),那么可供選擇的下一個位置共有8種可能。我們所要做的,就是從0號位置開始,依次判斷新的馬兒位置是否可用,不可用的話(即馬兒已經(jīng)走過該位置),則遍歷下一個可能的1號位置,直到7號位置停止,如果沒有可用位置,則進(jìn)行回溯,如果回溯到了起始位置,則表示此路不通,即無法從該位置開始遍歷整個棋盤。如果在遍歷0-7號位置的過程中,發(fā)現(xiàn)有可用位置,則將該位置坐標(biāo)賦予(x,y)。之后,利用遞歸,再次尋找馬兒的新的跳躍位置。直到馬兒跳了64次時停止,此時,馬兒就已經(jīng)將整個棋盤走過了。

      代碼如下:

      horse.c

        1 #include <stdio.h>  
        2 #include <stdlib.h>  
        3 #include <time.h>  
        4   
        5 #define X 5  //定義棋盤。為測試方便,用5格棋盤。8格棋盤的時間復(fù)雜度,真的傷不起啊……期待更好的算法  
        6 #define Y 5  
        7   
        8 void print_chess();  
        9 int next(int *x,int *y,int step);  
       10 int traverse(int x,int y,int count);  
       11 int traverse_chess(int x,int y,int tag);  
       12   
       13 int chess[X][Y]; //棋盤  
       14   
       15 int main23()  
       16 {  
       17     clock_t start,end; //記錄一下程序耗時  
       18     int i,j;  
       19     //初始化棋盤  
       20     for(i=0;i<X;i++)  
       21     {  
       22         for(j=0;j<Y;j++)  
       23         {  
       24             chess[i][j]=0;  
       25         }  
       26     }  
       27     start=clock();  
       28   
       29     //方法一  
       30     chess[2][0]=1;  
       31     int result=traverse(2,0,2);  
       32   
       33     //方法二  
       34     //int result=traverse_chess(2,0,1); //也可以使用這個方法  
       35   
       36     end=clock();  
       37     if(1==result)  
       38     {  
       39         printf("ok\n");  
       40         print_chess();  
       41         printf("共耗時:%f\n",(double)(end-start)/CLOCKS_PER_SEC);  
       42     }  
       43     else  
       44     {  
       45         printf("此路不通,馬兒無法踏遍所有棋格!\n");  
       46     }  
       47     return 0;  
       48 }  
       49   
       50 /* 
       51 判斷下一個結(jié)點位置是否可用 
       52 當(dāng)前結(jié)點位置(x,y) 
       53 step:下一個結(jié)點位置編號 
       54 */  
       55 int next(int *x,int *y,int step)  
       56 {  
       57    // printf("%d\n",step);  
       58     switch(step)  
       59     {  
       60         case 0:  
       61             if(*y+2<=Y-1 && *x-1>=0 && chess[*x-1][*y+2]==0)  
       62             {  
       63                 *y+=2;  
       64                 *x-=1;  
       65                 return 1;  
       66             }  
       67             break;  
       68         case 1:  
       69             if(*y+2<=Y-1 && *x+1<=X-1 && chess[*x+1][*y+2]==0)  
       70             {  
       71                 *y+=2;  
       72                 *x+=1;  
       73                 return 1;  
       74             }  
       75             break;  
       76         case 2:  
       77             if(*y+1<=Y-1 && *x+2<=X-1 && chess[*x+2][*y+1]==0)  
       78             {  
       79                 *y+=1;  
       80                 *x+=2;  
       81                 return 1;  
       82             }  
       83             break;  
       84         case 3:  
       85             if(*y-1>=0 && *x+2<=X-1 && chess[*x+2][*y-1]==0)  
       86             {  
       87                 *y-=1;  
       88                 *x+=2;  
       89                 return 1;  
       90             }  
       91             break;  
       92         case 4:  
       93             if(*y-2>=0 && *x+1<=X-1 && chess[*x+1][*y-2]==0)  
       94             {  
       95                 *y-=2;  
       96                 *x+=1;  
       97                 return 1;  
       98             }  
       99             break;  
      100         case 5:  
      101             if(*y-2>=0 && *x-1>=0 && chess[*x-1][*y-2]==0)  
      102             {  
      103                 *y-=2;  
      104                 *x-=1;  
      105                 return 1;  
      106             }  
      107             break;  
      108         case 6:  
      109             if(*y-1>=0 && *x-2>=0 && chess[*x-2][*y-1]==0)  
      110             {  
      111                 *y-=1;  
      112                 *x-=2;  
      113                 return 1;  
      114             }  
      115             break;  
      116         case 7:  
      117             if(*y+1<=Y-1 && *x-2>=0 && chess[*x-2][*y+1]==0)  
      118             {  
      119                 *y+=1;  
      120                 *x-=2;  
      121                 return 1;  
      122             }  
      123             break;  
      124         default:  
      125             break;  
      126     }  
      127     return 0;  
      128 }  
      129   
      130 /* 
      131 遍歷整個棋盤-方法一 
      132 (x,y)為坐標(biāo)位置 
      133 count為遍歷次數(shù) 
      134 */  
      135 int traverse(int x,int y,int count)  
      136 {  
      137     int x1=x,y1=y; //新節(jié)點位置  
      138     if(count>X*Y) //已全部遍歷且可用,則返回。  
      139         return 1;  
      140     int flag,result,i;  
      141     for(i=0;i<8;i++)  
      142     {  
      143         flag=next(&x1,&y1,i); //尋找下一個可用位置  
      144         if(1==flag)  
      145         {  
      146             chess[x1][y1]=count; //新找到的結(jié)點標(biāo)識可用,  
      147             result=traverse(x1,y1,count+1); //以新節(jié)點為根據(jù),再次遞歸下一個可用結(jié)點  
      148             if(result) //當(dāng)前棋盤已全部可用  
      149             {  
      150                 return 1;  
      151             }  
      152             else //新找到的結(jié)點無下一個可用位置,進(jìn)行回溯  
      153             {  
      154                 chess[x1][y1]=0;  
      155                 x1=x; //結(jié)點位置也要回溯  
      156                 y1=y;  
      157             }  
      158         }  
      159     }  
      160     return 0;  
      161 }  
      162   
      163 /* 
      164 遍歷整個棋盤-方法二 
      165 (x,y)為坐標(biāo)位置 
      166 tag為遍歷次數(shù) 
      167 */  
      168 int traverse_chess(int x,int y,int tag)  
      169 {  
      170     int x1=x,y1=y,flag=0,count=0;  
      171     chess[x][y]=tag;  
      172     if(X*Y==tag)  
      173     {  
      174         return 1;  
      175     }  
      176     flag=next(&x1,&y1,count);  
      177     while(0==flag && count<=7)  
      178     {  
      179         count++;  
      180         flag=next(&x1,&y1,count);  
      181     }  
      182     while(flag)  
      183     {  
      184         if(traverse_chess(x1,y1,tag+1)) //如果全部遍歷完畢,則返回。  
      185         {  
      186             return 1;  
      187         }  
      188         //沒有找到下一個可用結(jié)點,則回溯  
      189         x1=x;  
      190         y1=y;  
      191         count++;  
      192         flag=next(&x1,&y1,count);  
      193         while(0==flag && count<=7)  
      194         {  
      195             count++;  
      196             flag=next(&x1,&y1,count);  
      197         }  
      198     }  
      199     if(flag==0)  
      200     {  
      201         chess[x][y]=0;  
      202     }  
      203     return 0;  
      204 }  
      205   
      206 /* 
      207 打印棋盤 
      208 */  
      209 void print_chess()  
      210 {  
      211     int i,j;  
      212     for(i=0;i<X;i++)  
      213     {  
      214         for(j=0;j<Y;j++)  
      215         {  
      216             printf("%d\t",chess[i][j]);  
      217         }  
      218         printf("\n");  
      219     }  
      220 }  

      測試結(jié)果:

       

      posted @ 2017-07-03 15:54  lpfuture  閱讀(4078)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产一区二区三区免费观看| 制服丝袜美腿一区二区| 欧美xxxxx高潮喷水| 色一情一乱一区二区三区码| 免费网站看V片在线毛| 久久精品无码免费不卡| 久久国产精品老人性| 亚洲成av人片色午夜乱码| 久久久av男人的天堂| 少妇人妻偷人一区二区| 亚洲欧洲美洲无码精品va| 国产极品精品自在线不卡| 亚洲综合小说另类图片五月天| 免费99视频| 国产精品亚洲中文字幕| 镇沅| 亚洲免费人成视频观看| 亚洲免费的福利片| 无码AV中文字幕久久专区| 国产成人不卡一区二区| 国产女精品视频网站免费| 亚洲婷婷综合色高清在线| 另类专区一区二区三区| 国产日韩精品一区在线不卡| 中文人妻av高清一区二区| 南丹县| 无码丰满人妻熟妇区| 国产区成人精品视频| 在线a亚洲v天堂网2018| 日韩av中文字幕有码| 亚洲最大成人免费av| 麻豆精品久久精品色综合| 国产太嫩了在线观看| 久热久热中文字幕综合激情| 67194熟妇在线观看线路| 将乐县| 国产精品久久久久久福利69堂| 亚洲色大成网站www久久九九| 日本一区二区三区专线| 国产精品视频全国免费观看| 又粗又紧又湿又爽的视频|