zoukankan      html  css  js  c++  java
  • 国际象棋马走日(骑士周游)

     1 /*
     2 **假设国际象棋棋盘有5*5=25个格子,设计一个程序,使棋子从初始位置开始跳马,能够把棋盘格子全部走一遍
     3 **每个格子只允许走一次。
     4 **要求:1)写出其中一个解。
     5         2)求总共有多少个解。
     6 **/
     7 
     8 //算法思路:
     9 /*
    10 **由于对于程序来讲,每一个格子都是新的开始,都面临着同样的选择,即都有八个方向的选择
    11 **因此适用于递归思想。至于能否走通,得去尝试。递归过程中,产生一颗递归树,检查过程中
    12 **走不通就剪枝。尝试下一个树枝。因此有int trial(int x,int y)函数。棋盘用一个二维数组
    13 **表示棋子序号,一个坐标代表,再用一个二维数组记录棋盘的某个坐标是否已经被踏过。
    14 */
    15 
    16 #include<stdio.h>
    17 
    18 int trace[25] = {0}, counter = 0;
    19 int steps = 0, k = 1;             //k在此的作用为只打印一种方案的开关
    20 int chessboard[5][5];            //棋盘
    21 int flag[5][5];                    //给棋盘做标记
    22 
    23 //函数声明区
    24 void init();
    25 void printResult(int k);
    26 void walk(int x, int y);
    27 
    28 int main(){
    29     init();
    30     walk(0, 0);
    31     printf("the answer number:%d
    ", counter);
    32     return 0;
    33 }
    34 
    35 /*
    36 **探寻可走的路
    37 */
    38 void walk(int x, int y)
    39 {
    40     if(x<0 || x >4 || y<0 || y > 4 || flag[x][y] == 1)
    41         return;                            //走不通,返回.
    42     flag[x][y] = 1;
    43     trace[steps++] = chessboard[x][y];    //记录每一步所走的位置
    44     if(steps > 24)
    45     {
    46         counter++;            
    47         printResult(100);
    48         flag[x][y] = 0;
    49         steps--;
    50         return;
    51     }
    52     //这里是每个格子的各种走法
    53     walk(x + 1, y + 2);        //上走有拐
    54     walk(x + 1, y - 2);        //上走左拐
    55     walk(x - 1, y + 2);        //下走有拐
    56     walk(x - 1, y - 2);        //下走左拐
    57     walk(x + 2, y + 1);        //右走上拐
    58     walk(x + 2, y - 1);        //右走下拐
    59     walk(x - 2, y + 1);        //左走上拐
    60     walk(x - 2, y - 1);        //左走下拐
    61     flag[x][y] = 0;
    62     steps--;
    63 }
    64 
    65 
    66 //初始化二维数组
    67 void init()
    68 {
    69     int i,j,pos = 1;
    70     for(i = 0 ; i < 5 ; i++)
    71         for(j = 0 ; j < 5 ; j++)
    72         {
    73             chessboard[i][j] = pos++;     //初始化棋盘
    74             flag[i][j] = 0;                //初始化话标记
    75         }
    76 }
    77 
    78 
    79 /*
    80 **打印第k个结果,k为0默认打印全部。
    81 */
    82 
    83 void printResult(int k)
    84 {
    85     int i;
    86     static num = 0;
    87     if(k !=0 )
    88         if(++num != k)
    89             return;
    90     printf("The %dth case is: for example [step,point]
    ",k);
    91     for (i = 0; i < 25; i++)
    92     {
    93         printf("[%-2d,%-2d] ", i+1, trace[i]);
    94         if((i+1)%5==0)
    95             printf("
    ");
    96     }
    97 }
  • 相关阅读:
    条件语句的用法
    PHP取得当前文档所在的目录
    郁闷,一个语句调试很久
    PHP图片上传加水印(转)
    PHP多行多列分页
    ASP得到当前文件所在目录
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛D IP检测(绿)
    “树人杯”暨第三届辽宁科技大学校园程序设计竞赛正赛E 成绩统计图(红)
    [面试备] 暴搜 or 二分图的经典升级 : hdu 1045 Fire Net 示例 [ 讲解之用 ]
    《C++ Primer》 第04章 [ 数组和指针 ]
  • 原文地址:https://www.cnblogs.com/houjun/p/6507689.html
Copyright © 2011-2022 走看看