我下面的代码可以解决每一条路径怎么走,所以效率比较低,不适合用了求总数。但我觉得,能够求出每种具体路径,也是一种锻炼,分享给大家吧。至少我自己通过编写这个,递归的能力提升了不少。#include<stdio.h>
#include<time.h>
#define ORDER 7
int n;
int next(int (*p1)[ORDER],int x,int y)
{
int tag=0;
int grid2[ORDER][ORDER];
int i,j;
for(i=0;i<ORDER;i++)
{
for(j=0;j<ORDER;j++)
{
grid2[i][j]=p1[i][j];
}
}
while(tag<2)
{
if(0==tag)
{
tag++;
if(x>=ORDER-1)
{
nextright(grid2,x,y);
return 0;
}
nextunder(grid2,x,y);
}
else if(1==tag)
{
tag++;
if(y>=ORDER-1)
{
return 0;
}
nextright(grid2,x,y);
return 0;
}
}
}
int nextright(int (*p2)[ORDER],int x,int y)
{
int grid3[ORDER][ORDER];
int i,j;
for(i=0;i<ORDER;i++)
{
for(j=0;j<ORDER;j++)
{
grid3[i][j]=p2[i][j];
}
}
if(1==grid3[ORDER-1][ORDER-1])
{
n++;
printf("这是第%d种\n",n);
for(i=0;i<ORDER;i++)
{
for(j=0;j<ORDER;j++)
{
printf("%d ",*(*(grid3+i)+j));
}
printf("\n");
}
return 0;
}
grid3[x][y+1]=1;
next(grid3,x,y+1);
return 0;
}
int nextunder(int (*p3)[ORDER],int x,int y)
{
int grid4[ORDER][ORDER];
int i,j;
for(i=0;i<ORDER;i++)
{
for(j=0;j<ORDER;j++)
{
grid4[i][j]=p3[i][j];
}
}
if(1==grid4[ORDER-1][ORDER-1])
{
n++;
printf("这是第%d种\n",n);
for(i=0;i<ORDER;i++)
{
for(j=0;j<ORDER;j++)
{
printf("%d ",*(*(grid4+i)+j));
}
printf("\n");
}
return 0;
}
grid4[x+1][y]=1;
next(grid4,x+1,y);
return 0;
}
void main()
{
int grid[ORDER][ORDER];
int i,j;
clock_t start,end;
start=clock();
for(i=0;i<ORDER;i++)
{
for(j=0;j<ORDER;j++)
{
grid[i][j]=0;
}
}
grid[0][0]=1;
next(grid,0,0);
end=clock();
printf("一共用时%f秒\n",(double)(end-start)/CLK_TCK);
}
|