有一个X*Y的网格,小团要在此网格上从左上角到右下角,只能走格点且只能向右或向下走。请设计一个算法,计算小团有多少种走法。给定两个正整数int x,int y,请返回小团的走法数目。
#include<bits/stdc++.h>
usingnamespacestd;
inta[11][11]={0};
intmain(){
intm,n;
cin>>m>>n;
if(m==0||n==0){
cout<<1<<endl;
return0;
}else{
for(inti=0;i<=m;i++)a[i][n]=1;
for(inti=0;i<=n;i++)a[m][i]=1;
for(inti=m-1;i>=0;i--){
for(intj=n-1;j>=0;j--){
a[i][j]=a[i][j+1]+a[i+1][j];
}
}
cout<<a[0][0]<<endl;
}
return0;
}
动态规划
import java.util.Scanner;
public class Main {
public static int ways(int x, int y){
if(x==1 || y==1){
return x*y+1;
}
return ways(x-1,y)+ways(x,y-1);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int x = in.nextInt();
int y = in.nextInt();
System.out.println(ways(x,y));
}
}
}
#include <iostream>
#include <vector>
using namespace std;
// DP 做法
int main(const int argc, const char** argv) {
int m, n;
cin >> m >> n;
vector<vector<int>> grid(m + 1, vector<int>(n + 1, 1));
for (int y = 1; y <= m; ++y)
for (int x = 1; x <= n; ++x)
grid[y][x] = grid[y - 1][x] + grid[y][x - 1];
cout << grid[m][n];
return 0;
} const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
ouput: process.stdout
})
let inArr = []
rl.on('line',line=>{
if(!line) return
inArr.push(line.trim())
if(inArr.length === 1){
let arr = inArr[0].split(' ').map(e=>+e)
let x = arr[0]
let y = arr[1]
let res = uniquePaths(x, y)
console.log(res)
}
})
var uniquePaths = function(x, y) {
let dp = []
for(let i=0; i<=x; i++)
{
dp[i]=[]
}
for(let i=0; i<=x; i++)
{
for(let j=0; j<=y; j++)
{
if(i==0 || j==0)
dp[i][j]=1
else
dp[i][j]=dp[i][j-1]+dp[i-1][j]
}
}
return dp[x][y]
}; #include <iostream>
using namespace std;
int f(int n, int k){
int sum = 1, i = 1;
if(k * 2 > n)
k = n-k;
while(i <= k){
sum *= n;
sum /= i;
++i;
--n;
}
return sum;
}
int main(void){
int x, y;
cin>>x>>y;
cout<<f(x+y, y)<<endl;
return 0;
} import java.util.*;
public class Main {
/* **用组合数,总共需要x+y步,挑x步走,或者挑y步走
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long x=sc.nextInt();
long y=sc.nextInt();
System.out.println(jc(x+y)/(jc(x)*jc(y)));
}
private static long jc(long n){//阶乘
long sum=1;
for (long i = 1; i <= n ; i++) {
sum*=i;
}
return sum;
}
} #include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int x,y;
cin>>x>>y;
vector<vector<int>>dp(x+1,vector<int>(y+1,0));
for(int i=0;i<x+1;i++)
{
for(int j=0;j<y+1;j++)
{
if(i==0||j==0)
{
dp[i][j]=1;
}
else{
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
cout<<dp[x][y]<<endl;
return 0;
} """" 动态规划,dp[x][y]表示所有走法的数目 到达x,y点的路径只有两条,从上边和从左边 dp[x][y] = dp[x - 1][y] + dp[x][y - 1] 边界 dp[0][y] = dp[x][0] = 1 """ if __name__ == "__main__": n, m = map(int, input().strip().split()) dp = [[1] * (m + 1) for _ in range(n + 1)] for i in range(1, n + 1): for j in range(1, m + 1): dp[i][j] = dp[i - 1][j] + dp[i][j - 1] print(dp[n][m])
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
#define m 15
int main()
{ int x, y; int i, j; int dp[m][m]; cin >> x >> y; for (i = 0; i <= x; i++) {
/*初始化dp数组的第1列为1*/ dp[i][0] = 1; for (j = 1; j <= y; j++) {
/*初始化dp数组的第一行为1,若不是第一行则左边格点的路线数加上上边格点的路线数*/ if(i==0) dp[0][j] = 1; else { dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } } cout << dp[x][y] << endl; system("pause"); return 0;
}
import java.util.Scanner;
import java.lang.Integer;
public class Main {
public static int resultCount (int x, int y) {
if (x == 0 || y == 0) {
return 1;
}
return resultCount(x-1, y) + resultCount(x, y-1);
}
public static void main(String [] args) {
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
String[] ss = str.split(" ");
int x = Integer.parseInt(ss[0]);
int y = Integer.parseInt(ss[1]);
int result = resultCount(x,y);
System.out.print(result);
}
} import java.util.Scanner;
/**
* 方格走法
*
* @author chensiqu
* @since 2019/4/2 17:10
*/
public class GridWay {
private static int count = 0;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x, y;
x = scanner.nextInt();
y = scanner.nextInt();
// 递归解法
core(x, y, 0, 0);
System.out.println(count);
// 动态规划数组,数组内数值为到这点的走法。
int[][] ints = new int[x + 1][y + 1];
// 初始化 第一行走法全为 1
for (int i = 0; i < y + 1; i++) {
ints[0][i] = 1;
}
// 初始化 第一列走法全为 1
for (int i = 1; i < x + 1; i++) {
ints[i][0] = 1;
}
// 从 ints[1][1]开始,这点的走法为上方的点加上左方的点走法相加。
for (int i = 1; i <= x; i++) {
for (int j = 1; j <= y; j++) {
ints[i][j] = ints[i - 1][j] + ints[i][j - 1];
}
}
System.out.println(ints[x][y]);
}
/**
* 递归深度优先遍历解法
*
* @param rows 行
* @param cols 列
* @param i 横坐标
* @param j 纵坐标
*/
private static void core(int rows, int cols,
int i, int j) {
if (i > rows || j > cols) {
return;
}
// 到达目标点,则 count++
if ((i == rows) && (j == cols)) {
count++;
return;
}
// 深度优先遍历
core(rows, cols, i + 1, j);
core(rows, cols, i, j + 1);
}
}
package main
import (
"fmt"
)
func main() {
var x,y int
fmt.Scan(&x,&y)
mat:=make([][]int,x+1)
for i,_:=range mat{
mat[i]=make([]int,y+1)
}
for i:=0;i<=y;i++{
mat[0][i]=1
}
for i:=0;i<=x;i++{
mat[i][0]=1
}
for i:=1;i<=x;i++{
for j:=1;j<=y;j++{
mat[i][j]=mat[i-1][j]+mat[i][j-1]
}
}
fmt.Print(mat[x][y])
}
import java.util.*;
public class Main{
public static long jc(int n){
long x=1;
for(int i=1;i<=n;i++){
x*=i;
}
return x;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()){
int x=sc.nextInt();
int y=sc.nextInt();
System.out.println(jc(x+y)/(jc(x)*jc(y)));
}
}
} s = input() x = int(s.split()[0]) y = int(s.split()[1]) def foo(a, b): if a == 1 and b == 1: return 0 if a == 1&nbs***bsp;b == 1: return 1 return foo(a, b-1) + foo(a-1, b) print(foo(x+1, y+1))