求助dalao

日月三辰 2019-01-24 09:01:33
给你一幅n*m的地图,地图标注了某些地方有地雷,你要避免踩到地雷,因为踩到地雷你就挂了,GG。
例如给你一幅(2*2)的地图:
0 0
1 0
这里用一个二维数组来代表地图,0表示没地雷,1表示有地雷,该图表示坐标(2,1)有地雷。
游戏规则:你从坐标(1,1)开始走,只能向下走或向右走,不能向上走和向左走,走到(2,2),不踩到雷算你赢。(对于n*m的地图,从坐标(1,1)走到坐标(n,m))
某同学说:对于这幅(n*m)图,我有N中方法玩,厉害了。

输入一幅地图,输出有多少种玩法。(2 < n, m < 1000)
这道题怎么做啊。
...全文
106 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
636f6c696e 2019-01-25
  • 打赏
  • 举报
回复
这是最最基础的动态规划,看不懂的话自行百度,这里说再多你也无法完全理解
日月三辰 2019-01-25
  • 打赏
  • 举报
回复
有没有大佬能帮帮我啊
小熊之怒 2019-01-25
  • 打赏
  • 举报
回复
写了一个简单的,趁着上班没事做。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//10*10的地图

int cur = 0;
//初始化地图,和打印地图。sign标志是打印还是初始化
void init_map(int pmap[10][10], int sign)
{
int i=0, j=0;
for(i=0; i<10; i++)
{
for(j=0; j<10; j++)
{
if(sign){
pmap[i][j] = 0;
}
printf("%d ", pmap[i][j]);
}
printf("\n");
}

}

void add_mine(int pmap[10][10], int num)
{
srand(1);
int i=0, j=0, k=0;
//手动加地雷
pmap[3][0] = 1;
pmap[0][4] = 1;
pmap[4][2] = 1;
pmap[2][1] = 1;
pmap[1][6] = 1;
pmap[2][9] = 1;
pmap[6][1] = 1;
pmap[8][6] = 1;
pmap[5][6] = 1;

//随机加地雷
//for(k=0; k<num; k++)
//{
// i = rand()%9;
// j = rand()%10;
// pmap[i][j] = 1;
//}
}

//添加结果,走过那些格子
int add(int *arr, int i, int j)
{
int last_i = arr[cur-1] / 100;
if(last_i > i)
{
cur -= 1;
}
arr[cur] = i*100 + j;
printf("static value cur %d %d:\n", cur, arr[cur]);
cur += 1;
}

int walk(int pmap[10][10], int *arr)
{
int i=0,j=0;
while(i<10 || j<10)
{

if(pmap[i+1][j] != 1 && i <10) //默认向下走
{
//先向下移动
i += 1;
add(arr, i, j);
}
else if(pmap[i][j+1] != 1 && j < 10) //向下不行向右走
{
j += 1;
add(arr, i, j);
}
else if(pmap[i+1][j] == 1 && pmap[i][j+1] == 1) //如果下面和右面都有地雷,退回去,还有很多种可能,只考虑了一种 从开始的向下错误的一步改为向右
{
i -= 1;
j += 1;
add(arr, i, j);
}
else
{
printf("堵死了,右下都不能走");
break;
return 0;
}
}
return 1;
}

int main()
{
int map[10][10];
int arr_res[100] = {0}; //保存行走的路径

//初始化地图
init_map(map, 1);
//添加地雷
add_mine(map, 10);
//查看结果
printf("=================\n");
init_map(map, 0);

int i = 0;
//
int res = walk(map, arr_res);
if(res)
{
printf("可以到达,路径如下:\n");
for(i = 0;i<100; i++)
{
if(arr_res[i]==0)
{
break;
}
else
{
printf("[%d][%d] ", arr_res[i]/100, arr_res[i]%100);
}
}
printf("\n");
}
return 0;
}

日月三辰 2019-01-24
  • 打赏
  • 举报
回复
引用 1 楼 lin5161678的回复:
基础入门的动态规划
到达边缘坐标的方法只有 1 种
到达非边缘左边有两种 从左边或者上边过来 所以到达这一点的方法种数是 到达左边节点的个数 加上 到达上边节点的个数
再注意一下跳过地雷就好了
我不是特别的懂
lin5161678 2019-01-24
  • 打赏
  • 举报
回复
基础入门的动态规划
到达边缘坐标的方法只有 1 种
到达非边缘左边有两种 从左边或者上边过来 所以到达这一点的方法种数是 到达左边节点的个数 加上 到达上边节点的个数
再注意一下跳过地雷就好了

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧