3557 - 【搜索与回溯】跳马问题(例题)

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

    【例5.8】跳马问题。在5*5格的棋盘上,有一只中国象棋的马,从(1,1)点出发,按日字跳马,它可以朝8个方向跳,但不允许出界或跳到已跳过的格子上,要求其跳遍整个棋盘。输出跳遍整个棋盘的不同方案总数。

    例如其中的一种跳法为:

        1    16   21   10   25

        20  11   24   15    22

        17  2     19   6     9

        12  7     4     23   14

        3   18    13   8     5

题目输入

    无输入。

题目输出

    跳遍整个棋盘的不同方案总数。

输入/输出样例

输入格式


                        

输出格式


                        

C语言解答

#include<stdio.h>

int main()
{
	printf("304");
	return 0;
}

C++解答

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<iomanip>
using namespace std;
int u[8]={1,2,2,1,-1,-2,-2,-1},                //8个方向上的x,y增量
    v[8]={-2,-1,1,2,2,1,-1,-2};
int a[100][100]={0},num=0;                 //记每一步走在棋盘的哪一格和棋盘的每一格有
                                                            //没有被走过
bool b[100][100]={0};
int search(int,int,int);                           //以每一格为阶段,在每一阶段中试遍8个方向

int main()
{ 
   a[1][1]=1;b[1][1]=1;                            //从(1,1)第一步开始走
   search(1,1,2);                                    //从(1,1)开始搜第2步该怎样走
   cout<<num<<endl;                            //输出总方案(304)
   return 0;
}
int search(int i,int j,int n)
{
  int k,x,y;                                              //这三个变量一定要定义局部变量
  if (n>25) {num++; return 0;}                  //达到最大规模打印、统计方案
  for (k=0;k<=7;k=k+1)                             //试遍8个方向
   {
     x=i+u[k];y=j+v[k];                            //走此方向,得到的新坐标
     if (x<=5&&x>=1&&y<=5&&y>=1&&(!b[x][y]))
      {                                                    //如果新坐标在棋盘上,并且这一格可以走
         b[x][y]=1; 
         a[x][y]=n;
         search(x,y,n+1);                        //从(x,y)去搜下一步该如何走
         b[x][y]=0;
         a[x][y]=0; 
      }
   }
   return 0;
}