请问走n步回到0有几种不同的走法

本文探讨了一个数学与编程结合的问题:在一个0到9的封闭环上,如何计算N步后回到起点0的所有可能路径数量。文章通过分析不同步数下返回原点的可能性,提出了一种基于组合数学原理的算法解决方案,并提供了具体的Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个从0-9的封闭环,即是0-1-2-3-4-5-6-7-8-9-0, 可以正向走,也可以逆向走; 请问走n步回到0有几种不同的走法(譬如n为2, 0-1-0, 0-9-0共有两种走法)?

public class Circle {

/**
 * 单数不可能回到原点, 因为圆圈点为10 , 10是2 的倍数。
 * 转换成求排列组合问题, 比如N == 6, 则必然有3步向前,3步后退, 无关顺序,所以只要选3个位置存放向前即可,组合共有6*5*4 / 3/2 =  20种方案
 * 当N > 10 时,需要进行迭代, 因为过10则可以有全向前的步数。 当N == 10 时,多出两个走法。
 * @param args
 */


public static void main(String[] args){
    System.out.println("hello");
    //System.out.print(calcu(6, 2));
    System.out.println(findNumber(11));
    System.out.println(findNumber(12));
    System.out.println(findNumber(22));
}


static Integer findNumber(Integer N){

    if (N == 0 || N %2 == 1){
        return 0;
    }
    Integer Number = travel(N - 10, N);
    return Number;
}

static Integer travel(Integer needInsert, Integer N){
    if (needInsert <0){
        return calcu(N, N/2);
    }else if (needInsert == 0){
        return calcu(N, N/2) + 2;
    }else if (needInsert % 10 == 0){
        return 2 * calcu(N, needInsert/2) + travel(needInsert -10, N) + 2;
    }else {
        return 2 * calcu(N, needInsert/2) + travel(needInsert -10, N);
    }
}

static Integer calcu(Integer n, int i) {
    int number = 1;
    int temp = 1;
    while(i >0){
        number = number * (n-i +1);
        temp = temp * i;
        i--;
    }
    return number / temp;
}

}

题目描述 五子棋是一种流传很广的棋类游戏,在一个 15×15 的棋盘上,对弈双方执黑白棋子(类似于围棋),执黑子者先下,凡落下的棋子不能被提起,即不存在挪子和吃子的情况。 为了简化问题,假设黑方不存在“禁手”,“禁手”是五子棋术语,指禁止棋子的地方。当某选手的棋子在横、竖、45 度斜线方向、135 度斜线方向之一先出现相连的 5 个棋子时,该选手获胜。 先考虑轮到黑棋的一盘残局,请给出黑棋获胜的最少数和在该数下能获胜的所有不同的下一走法。 输入格式 共有 15 行,每行有 15 个由一个空格隔开的整数。第 i 行,第 j 列的整数记做 v i,j ​ ,用 v i,j ​ =0,1,2 表示第 i 行,第 j 列的位置为空、为黑子、为白子,从左上角开始,按从左至右,自上而下的顺序输入,即输入的第 1 行第 1 列整数 v 1,1 ​ 表示第 1 行第 1 列位置的状态,输入的第 15 行第 15 列整数 v 15,15 ​ 表示第 15 行第 15 列位置的状态。 输出格式 第一行为两个整数 a 和 b,其中:a 表示黑棋获胜的最少数,b 表示黑棋在 a 获胜的所有不同的下一走法的种数。 从第二行到第 b+1 行,每行有两个整数,分别表示黑棋在 a 获胜的一种下一走法落子位置的行数 i 和列数 j,要求这些走法按照 15×i+j 的大小从小到大排列。 输入输出样例 输入 #1复制 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 2 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 0 0 0 0 0 0 0 0 2 1 1 1 1 2 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 2 2 0 1 1 0 2 0 0 0 0 0 0 0 0 0 0 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 输出 #1复制 3 2 10 9 10 11生成ACc++解题代码
最新发布
03-21
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值