• 跳马问题


    【问题描述】
    有一只中国象棋中的“ 马” ,在半张棋盘的左上角出发,向右下角跳去。
    规定只许向右跳(可上,可下, 但不允许向左跳)。请编程求从起点A(1,1)到终点B(m,n) 共有多少种不同跳法。

    【输入格式】
    输入文件只有一行,两个整数m 和n(1≤m,n≤20),两个数之间有一个空格。


    【输出格式】
    输出文件只有一个整数,即从A 到B 全部的走法。


    【输入输出样例】
    输入文件(horse.in)
    5 9
    输出文件(horse.out)
    37

     

     

    经典的 dfs 板子题,不做解释。

     

    ***然后我被坑了:我以为棋盘大小就是一般的象棋棋盘那么大,然后数组也就开了那么大,GG了……………………

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<iostream>
     6 using namespace std;
     7 typedef long long ll;
     8 #define rep(i, a, n) for(int i = a; i <= n; ++i)
     9 #define per(i, n, a) for(int i = n; i >= a; --i)
    10 int m, n, tot = 0;
    11 int dx[10] = {0, -2, -1, 1, 2}, dy[10] = {0, 1, 2, 2, 1};
    12 bool a[25][25];
    13 void dfs(int x, int y) 
    14 {
    15     if(x == m && y == n) {tot++; return;}
    16     rep(i, 1, 4) 
    17     {
    18         int newx = x + dx[i], newy = y + dy[i];
    19         if(newx > 0 && newx <= m && newy > 0 && newy <= n && !a[newx][newy]) 
    20         {
    21             a[newx][newy] = 1;
    22             dfs(newx, newy);
    23             a[newx][newy] = 0;
    24         }
    25     }
    26 }
    27 int main() 
    28 {
    29   freopen("horse.in", "r", stdin);
    30   freopen("horse.out", "w", stdout);
    31     scanf("%d%d", &m, &n);
    32     dfs(1, 1);
    33     printf("%d
    ", tot);
    34     return 0;
    35 }
  • 相关阅读:
    requireJS搭建
    html启动本地.exe文件
    自定义input[type="checkbox"]的样式
    使用rem单位时css sprites的坑
    visibility API
    css动画
    去除ios端输入框的弹出
    *java类的生命周期
    处理高并发,防止库存超卖
    java注解的使用
  • 原文地址:https://www.cnblogs.com/mrclr/p/8665960.html
Copyright © 2020-2023  润新知