一个n*n 的方格,要从左下角走到右上角,一次只能往右或往上走一步,求算法得出所有走动的方法

xuxichun 2008-04-03 08:04:19
能不能说一下算法的详细步骤,谢谢~
...全文
5429 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-04-30
  • 打赏
  • 举报
回复
没遇到过这种情况.
CauthyJava 2008-04-12
  • 打赏
  • 举报
回复
组合数学。。。。
yydrewdrew 2008-04-08
  • 打赏
  • 举报
回复
原问题就是在x方向减一和y方向减一的两个子问题组成
这样递归

find(0,2,pvtr,3);
0,2表示左下角坐标
3表示题中的n
freeCodeSunny 2008-04-08
  • 打赏
  • 举报
回复
 回复6L
你可以画一个坐标,试试就知道了>
medie2005 2008-04-07
  • 打赏
  • 举报
回复
回ls:
应该是以m=1,n=1代入.
我说的是: "n个0和n个1组成的01串的排列有多少种?".
对于2*2的方格,对应的是1个1和1个0组成的01串.
jmulxg 2008-04-07
  • 打赏
  • 举报
回复
对于1、5楼的公式,用m=2,n=2代入得

f(m,n)=(2+2)!/(2!*2!)
=4!/(2!*2!)
=4*3*2/(2*2)
=6

对于2*2的方格应该只有两种走法吧。。
01
10

公式应该为
f(m,n)=(m+n-2)!/((m-1)!*(n-1)!)
xuxichun 2008-04-07
  • 打赏
  • 举报
回复
楼上这位仁兄,你写的程序能不能作个解释啊
yydrewdrew 2008-04-07
  • 打赏
  • 举报
回复
用分治法ms可以:

#include <vector>
#include <iostream>
using namespace std;

struct Point
{
int x;
int y;
};
typedef vector<Point> PVtr;
typedef vector<Point>::iterator PIter;
void find(const int sizex,const int sizey,PVtr pvtr,const int max)
{
if (sizex == max - 1 && sizey == 0)
{
cout<<"out:"<<endl;
cout<<0<<" "<<max - 1<<endl;
for (PIter i = pvtr.begin();i != pvtr.end();++i)
{
cout<<(*i).x<<" "<<(*i).y<<endl;
}
cout<<endl;
return;
}
if (sizex < max - 1)
{
Point p = {sizex + 1,sizey};
PVtr tem = pvtr;
tem.push_back(p);
find(sizex + 1,sizey,tem,max);
}
if (sizey > 0)
{
Point p = {sizex,sizey - 1};
PVtr tem = pvtr;
tem.push_back(p);
find(sizex,sizey - 1,tem,max);
}
}
int main()
{

PVtr pvtr;
find(0,2,pvtr,3);
return 0;
}
dlingt 2008-04-07
  • 打赏
  • 举报
回复
没明白楼主啥意思
freeCodeSunny 2008-04-05
  • 打赏
  • 举报
回复
这其实是重集的运用,有公式的
假设长为 M ,宽为N ,每次走一个单位的长度,
则一共的走法为(M+N)!/M!*N!,
onefours 2008-04-04
  • 打赏
  • 举报
回复
2维坐标
x轴表示向右,y轴向上

那么在n×n出的走法是:f(n,n) = f(n-1,n) + f(n, n-1). 求解
xuxichun 2008-04-04
  • 打赏
  • 举报
回复
如果用动态规划法求得所有的路径,可行么?
medie2005 2008-04-03
  • 打赏
  • 举报
回复
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
char dir[2]={'^','>'};
int n;
cin>>n;
int *L=new int[2*n];
for( int i=0; i<2*n; ++i )
L[i]=i<n? 0 : 1;
do{
for( int i=0; i<2*n; ++i )
cout<<dir[L[i]]<<" ";
cout<<endl;
}while( next_permutation( L, L+2*n ) );
delete []L;
return 0;
}
medie2005 2008-04-03
  • 打赏
  • 举报
回复
n个0和n个1组成的01串的排列有多少种?
当然是(2n)!/(n!*n!).

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧