n*n网格路径问题

最近做笔试题,网上各路牛人的答案给LZ提供了相当大帮助,也有了把自己的东西整理整理的兴趣。

 

某影音题:n*n网格,只能往右或下走,从右上角到左下角路径总数?

 

思路:网格每个点都只能向右走或下走两种选择,而网格边上的点则始终只有一条,所以完全可以用递归实现。

 

代码实现:

int func(int m, int n)
{
    if(m==0 || n==0)
        return 1;
    else
        return func(m, n-1)+func(m-1,n);
}

int TotalRoute(int n)
{
    return func(n-1,n)+func(n,n-1);
}



 

 

以下是用C语言实现的代码,其包括一个20*20的网格地图的二维数组和一个判断路径冲突的函数。 ```c #include <stdio.h> #include <stdbool.h> #define ROW 20 #define COL 20 int map[ROW][COL]; bool checkPath(int startX, int startY, int endX, int endY) { // 判断起点和终点是否合法 if (startX < 0 || startX >= ROW || startY < 0 || startY >= COL || endX < 0 || endX >= ROW || endY < 0 || endY >= COL) { printf("Invalid start or end position.\n"); return false; } // 判断是否同一个点 if (startX == endX && startY == endY) { printf("Start and end positions cannot be the same.\n"); return false; } // 判断起点和终点是否连通 if (map[startX][startY] == 0 || map[endX][endY] == 0) { printf("Start or end position is blocked.\n"); return false; } // 判断路径是否冲突 int dx = endX - startX; int dy = endY - startY; int absDx = dx > 0 ? dx : -dx; int absDy = dy > 0 ? dy : -dy; int signDx = dx > 0 ? 1 : -1; int signDy = dy > 0 ? 1 : -1; if (absDx > absDy) { // 沿x轴方向移动 int y = startY; for (int x = startX + signDx; x != endX; x += signDx) { if (map[x][y] == 0) { printf("Path is blocked at (%d, %d).\n", x, y); return false; } } } else { // 沿y轴方向移动 int x = startX; for (int y = startY + signDy; y != endY; y += signDy) { if (map[x][y] == 0) { printf("Path is blocked at (%d, %d).\n", x, y); return false; } } } return true; } int main() { // 初始化地图 for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { map[i][j] = 1; } } // 设置障碍物 map[5][5] = 0; map[5][6] = 0; map[5][7] = 0; // 测试路径冲突 printf("Checking path from (0, 0) to (5, 8)...\n"); checkPath(0, 0, 5, 8); printf("Checking path from (5, 0) to (5, 8)...\n"); checkPath(5, 0, 5, 8); printf("Checking path from (0, 0) to (5, 5)...\n"); checkPath(0, 0, 5, 5); return 0; } ``` 以上代码,我们通过一个二维数组来表示一个20*20的网格地图。数组的每个元素都代表一个格子,如果该格子为1,则表示该位置可以通过,如果为0,则表示该位置被阻塞。 判断路径冲突的函数checkPath()接受起点和终点的坐标作为参数,首先判断起点和终点是否合法,然后判断起点和终点是否连通,最后根据路径的方向(沿x轴或y轴)逐一检查路径上的每个格子是否被阻塞。 在主函数,我们设置几个障碍物,并分别测试了三条路径,其第一条和第三条路径应该是合法的,而第二条路径应该是冲突的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值