首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

VMware 猫和老鼠玩象棋 java 实现解决方法

2013-11-05 
VMware 猫和老鼠玩象棋 java 实现猫和老鼠玩象棋,玩了M+N局,猫赢了M局 老鼠赢了N局 NM,而且在整个过程中,

VMware 猫和老鼠玩象棋 java 实现
猫和老鼠玩象棋,玩了M+N局,猫赢了M局 老鼠赢了N局 N>M,而且在整个过程中,猫的得分从来没有超过过老鼠,问共有多少种可能的比赛得分过程?

算法大致就是:看成N个数入栈,出栈M次,求入栈出栈总共有多少种可能(这是我在CSDN看到一位GG的思路,觉得挺好就实现了一下)

import java.util.Stack;

/**
 *猫和老鼠做游戏,其中猫赢了M次,老鼠赢了N次(N>M)
 *且中间过程中没有一次猫赢的次数超过老鼠
 *
 *可以把问题看成是N次入栈操作,M次出栈操作,总共有多少种方式,递归调用
 */
public class CatAndMouse {

static final int M = 2;
static final int N = 4;
static int count = 0;//记录总数

public static void main(String[] args) {
nextStep(0,0,true,0);
System.out.println("最多可能比赛得分过程:"+count);
}

/*递归调用函数,下一步的操作,判断下一次可能的操作,判断是否执行到完毕
* next ? true 入栈,false 出栈  
* stackSize 表示栈的大小 
*/
public static void nextStep(int countN,int countM,boolean next,int stackSize){
if(next){   
stackSize++;//入栈
countN++;
}
else{
stackSize--;//出栈
countM++;
}
if(countN<N){//接着入栈
nextStep(countN,countM,true,stackSize);
}
if(countM<M && stackSize>0){//接着出栈
nextStep(countN,countM,false,stackSize);
}
if(countN==N && countM==M){//找到一种可能
count++;
}
}
}

[解决办法]
机智的楼主!
下面是c++实现的动态规划算法:
#include<iostream>
using namespace std;
int main()
{
int i,j,m,n;
cout<<"m=? n=?"<<endl;
cin>>m>>n;
int **fun=new int *[m+1];
for(i=0;i<=m;i++)
fun[i]=new int[n+1];
fun[0][0]=0;
for(j=1;j<=n;j++)
fun[0][j]=1;
for(i=1;i<=m;i++)
for(j=i;j<=n;j++)
{
if(j==i) 
fun[i][j]=fun[i-1][j];
else
fun[i][j]=fun[i-1][j]+fun[i][j-1];
}
cout<<"count="<<fun[m][n]<<endl;
system("pause");
}

热点排行