69,382
社区成员
发帖
与我相关
我的任务
分享
#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;
}