练习24

 
  1. /*********************************************************************************
  2. 24. 某地街道把城市分割成矩形方格,每一方格叫作块,某人从家中出发上班,
  3.  向东要走M块,向北要走N块,(见图)。请设计一个程序,由计算机寻找并
  4.  打印出所有的上班的路径。
  5.                                                单位
  6.            ┬   ┌─┬─┬─┬─┬─┬─┬─┐
  7.            │   │  │  │  │  │  │  │  │
  8.            │   ├─┼─┼─┼─┼─┼─┼─┤
  9.            ↓   │  │  │  │  │  │  │  │
  10.            N   ├─┼─┼─┼─┼─┼─┼─┤
  11.            ↑   │  │  │  │  │  │  │  │
  12.            │   ├─┼─┼─┼─┼─┼─┼─┤
  13.            │   │  │  │  │  │  │  │  │
  14.            ┴   └─┴─┴─┴─┴─┴─┴─┘
  15.            家   ├─────→M←─────┤
  16. 分析: 只能向上和向右走,否则会走回头路;按照这样算,此人只要走M+N块就可以到达单位了;
  17.         因此,只能有两个方向走,每走一块,到达一个新地点,从新地点到单位是本问题的一个
  18.         子问题,所以此问题可以分为两个子问题;
  19.         采用分治算法
  20. **********************************************************************************/
  21. #include <stdio.h>
  22. #define M 7
  23. #define N 4
  24. typedef struct
  25. {
  26.     int x;
  27.     int y;
  28. }Pos;
  29. //保存路径(包括起点)
  30. Pos path[M+N+1];
  31. int counter = 0;
  32. FILE* fp;
  33. void move(int x, int y, int i)
  34. {
  35.     if(x>M || y>N)
  36.         return;
  37.     else 
  38.     {
  39.         //如果合法,记录地点
  40.         path[i].x = x;
  41.         path[i].y = y;
  42.         if(x==M && y==N)//如果已经到达单位,输出
  43.         {
  44.             int k;
  45.             counter++;//计算路径总数
  46.             for(k=0; k<M+N+1; k++)
  47.                 //printf(" (%d,%d) ",path[k].x,path[k].y);
  48.                 fprintf(fp," (%d,%d) ",path[k].x,path[k].y);//输出到文件
  49.             fprintf(fp,"/n");
  50.         }
  51.         else
  52.         {
  53.             i++;
  54.             move(x+1,y,i);//分治
  55.             move(x,y+1,i);//分治
  56.         }
  57.     }
  58. }
  59. void main()
  60. {
  61.     fp = fopen("path.txt","w");
  62.     move(0,0,0);
  63.     fprintf(fp,"一共有%d条路径!/n",counter);
  64.     fclose(fp);
  65. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值