|
发表于 2018-3-12 18:05:13
|
显示全部楼层
我下面的代码可以解决每一条路径怎么走,所以效率比较低,不适合用了求总数。但我觉得,能够求出每种具体路径,也是一种锻炼,分享给大家吧。至少我自己通过编写这个,递归的能力提升了不少。
- #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);
- }
复制代码 |
|