📄 main.cpp
字号:
/*********************************************************************************
24. 某地街道把城市分割成矩形方格,每一方格叫作块,某人从家中出发上班,
向东要走M块,向北要走N块,(见图)。请设计一个程序,由计算机寻找并
打印出所有的上班的路径。
单位
┬ ┌─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │
│ ├─┼─┼─┼─┼─┼─┼─┤
↓ │ │ │ │ │ │ │ │
N ├─┼─┼─┼─┼─┼─┼─┤
↑ │ │ │ │ │ │ │ │
│ ├─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
┴ └─┴─┴─┴─┴─┴─┴─┘
家 ├─────→M←─────┤
分析: 只能向上和向右走,否则会走回头路;按照这样算,此人只要走M+N块就可以到达单位了;
因此,只能有两个方向走,每走一块,到达一个新地点,从新地点到单位是本问题的一个
子问题,所以此问题可以分为两个子问题;
采用分治算法
**********************************************************************************/
#include <stdio.h>
#define M 7
#define N 4
typedef struct
{
int x;
int y;
}Pos;
//保存路径(包括起点)
Pos path[M+N+1];
int counter = 0;
FILE* fp;
void move(int x, int y, int i)
{
if(x>M || y>N)
return;
else
{
//如果合法,记录地点
path[i].x = x;
path[i].y = y;
if(x==M && y==N)//如果已经到达单位,输出
{
int k;
counter++;//计算路径总数
for(k=0; k<M+N+1; k++)
//printf(" (%d,%d) ",path[k].x,path[k].y);
fprintf(fp," (%d,%d) ",path[k].x,path[k].y);//输出到文件
fprintf(fp,"\n");
}
else
{
i++;
move(x+1,y,i);//分治
move(x,y+1,i);//分治
}
}
}
void main()
{
fp = fopen("path.txt","w");
move(0,0,0);
fprintf(fp,"一共有%d条路径!\n",counter);
fclose(fp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -