zoukankan      html  css  js  c++  java
  • 跳马

    【 问题描述】

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

    【输出格式示例】

    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

    【代码】

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int a[100][100]= {0},t=0; //数组记每一步走在棋盘的哪一格,t记录最终方案个数
    bool b[100][100]= {0}; //棋盘的每一格有没有被走过
    int h[8]= {1,2,2,1,-1,-2,-2,-1};//横坐标
    int z[8]= {2,1,-1,-2,2,1,-1,-2};//纵坐标
    int search(int,int,int);//在每一格中试遍所有的方案
    int print();//输出方案
    
    int main() {
        a[1][1]=1; //从一开始
        b[1][1]=1; //已经走过
        search(1,1,2);
        cout<<t<<endl; //最终有几种方案
        return 0;
    }
    
    int search(int i,int j,int n) {
        int x,y,q; //x为横,y为纵
        if(n>25) {
            print();
            return 0;
        }
        for(q=0; q<=7; q++) { //8次都试一遍
            //u横,v纵
            x=i+h[q];
            y=j+z[q];
            if((!b[x][y]) && x>=1 && x<=5 && y>=1 && y<=5) {
                b[x][y]=1; //已经使用
                a[x][y]=n;
                search(x,y,n+1);
                b[x][y]=0; //回溯
                a[x][y]=0;
            }
        }
    }
    
    int print() {
        t++;
        if(t<=5) {
            for(int p=1; p<=5; p++) {
                for(int q=1; q<=5; q++)
                    printf("%5d",a[p][q]);
                cout<<endl;
            }
            cout<<"-------------------------------"<<endl;
        } else if(t>5) return 0;
    }
    View Code

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    PHP数字补零的两种方法
    php 防跨站表单提交
    PHP字符串压缩
    原生JS实现表单序列化serialize()
    java并发实现原子操作
    Effective java -- 9 并发/序列化
    Effective java -- 8 异常
    Effective java -- 7 通用程序设计
    Effective java -- 6 方法
    Effective java -- 5 枚举和注解
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6612096.html
Copyright © 2011-2022 走看看