/妈妈找宝宝,1010矩阵,由数字-1,-2,-3,0以及正整数组成,其中,-2表示MUM的位置,-3表示BABY的位置,
//-1表示此路不通,0表示此路能走,但没有糖果,正整数表示可以走通还可以获得相对应的糖果数,
///求出:mum找到BABY的所有路径中,路径最短的并输出对应的糖果数,如多路径相同,输出糖果数较多的,
///如果不能找到BABY,输出-1;(程序保证只有一个-2和-3)
//例子:55 3 -1 0 -2 6,3 4 5 0 6,1 4 8 7 2,7 2 5 -1 3,-3 3 6 7 3 29颗糖 路线 -2078563
/*
#define N 5
void readAlldata(int data[][N])
{
int i = 0;
int j = 0;
for(i = 0; i < N; i++)
{ for(j = 0; j < N; j++)
{
scanf("%d", &data[i][j]);
}
}
}
void FindMomPos(int (*data)[N], int *MomPos)
{
int i = 0;
int j = 0;
for(i = 0; i < N; i++)
{
for(j = 0; j < N; j++)
{
if(data[i][j] == -2)
{
MomPos[0] = i;
MomPos[1] = j;
return;
}
}
}
}
void recursive(int data[][N], int MomPos[2], int curstep, int *pstep, int curFruits, int *pFruits,char *curpath, char *lastpath)
{
int map[N][N] = {0};
int mom[2] = {0};
char path[1000] = {0};
char temp[1000] = {0};
//向左走
if(MomPos[1] - 1 >= 0 && data[MomPos[0]][MomPos[1] - 1] >= 0)
{
memcpy(map, data, N * N * sizeof(int));
memcpy(mom, MomPos, 2 * sizeof(int));
mom[1] -= 1;
//记录妈妈的位置
//------------------------------------------------------------
sprintf(temp, “%d”, map[MomPos[0]][MomPos[1]]);
strcpy(path, curpath);
strcat(path,temp);
//------------------------------------------------------------
map[MomPos[0]][MomPos[1]] = -1;
if(curstep + 1 > *pstep)
{
return;
}
recursive(map, mom, curstep + 1, pstep, curFruits + map[mom[0]][mom[1]], pFruits, path, lastpath);
}
else if(MomPos[1] - 1 >= 0 && data[MomPos[0]][MomPos[1] - 1] == -3)
{
sprintf(temp, “%d”, data[MomPos[0]][MomPos[1]]);
strcpy(path, curpath);
strcat(path,temp);
if(curstep + 1 < *pstep)
{
*pstep = curstep + 1;
*pFruits = curFruits;
strcpy(lastpath, path);
}
else if(curstep + 1 == *pstep)
{
*pFruits = *pFruits > curFruits ? *pFruits : curFruits;
strcpy(lastpath, path);
}
}
//向右走
if(MomPos[1] + 1 < N && data[MomPos[0]][MomPos[1] + 1] >= 0)
{
memcpy(map, data, N * N * sizeof(int));
memcpy(mom, MomPos, 2 * sizeof(int));
mom[1] += 1;
//记录妈妈的位置
//------------------------------------------------------------
sprintf(temp, “%d”, map[MomPos[0]][MomPos[1]]);
strcpy(path, curpath);
strcat(path,temp);
//------------------------------------------------------------
map[MomPos[0]][MomPos[1]] = -1;
if(curstep + 1 > *pstep)
{
return;
}
recursive(map, mom, curstep + 1, pstep, curFruits + map[mom[0]][mom[1]], pFruits, path, lastpath);
}
else if(MomPos[1] + 1 < N && data[MomPos[0]][MomPos[1] + 1] == -3)
{
sprintf(temp, “%d”, data[MomPos[0]][MomPos[1]]);
strcpy(path, curpath);
strcat(path,temp);
if(curstep + 1 < *pstep)
{
*pstep = curstep + 1;
*pFruits = curFruits;
strcpy(lastpath, path);
}
else if(curstep + 1 == *pstep)
{
*pFruits = *pFruits > curFruits ? *pFruits : curFruits;
strcpy(lastpath, path);
}
}
//向上走
if(MomPos[0] - 1 >= 0 && data[MomPos[0] - 1][MomPos[1]] >= 0)
{
memcpy(map, data, N * N * sizeof(int));
memcpy(mom, MomPos, 2 * sizeof(int));
mom[0] -= 1;
//记录妈妈的位置
//------------------------------------------------------------
sprintf(temp, “%d”, map[MomPos[0]][MomPos[1]]);
strcpy(path, curpath);
strcat(path,temp);
//------------------------------------------------------------
map[MomPos[0]][MomPos[1]] = -1;
if(curstep + 1 > *pstep)
{
return;
}
recursive(map, mom, curstep + 1, pstep, curFruits + map[mom[0]][mom[1]], pFruits,path, lastpath);
}
else if(MomPos[0] - 1 >= 0 && data[MomPos[0] - 1][MomPos[1]] == -3)
{
sprintf(temp, “%d”, data[MomPos[0]][MomPos[1]]);
strcpy(path, curpath);
strcat(path,temp);
if(curstep + 1 < *pstep)
{
*pstep = curstep + 1;
*pFruits = curFruits;
strcpy(lastpath, path);
}
else if(curstep + 1 == *pstep)
{
*pFruits = *pFruits > curFruits ? *pFruits : curFruits;
strcpy(lastpath, path);
}
}
//向下走
if(MomPos[0] + 1 < N && data[MomPos[0] + 1][MomPos[1]] >= 0)
{
memcpy(map, data, N * N * sizeof(int));
memcpy(mom, MomPos, 2 * sizeof(int));
mom[0] += 1;
//记录妈妈的位置
//------------------------------------------------------------
sprintf(temp, “%d”, map[MomPos[0]][MomPos[1]]);
strcpy(path, curpath);
strcat(path,temp);
//------------------------------------------------------------
map[MomPos[0]][MomPos[1]] = -1;
if(curstep + 1 > *pstep)
{
return;
}
recursive(map, mom, curstep + 1, pstep, curFruits + map[mom[0]][mom[1]], pFruits,path, lastpath);
}
else if(MomPos[0] + 1 < N && data[MomPos[0] + 1][MomPos[1]] == -3)
{
sprintf(temp, “%d”, data[MomPos[0]][MomPos[1]]);
strcpy(path, curpath);
strcat(path,temp);
if(curstep + 1 < *pstep)
{
*pstep = curstep + 1;
*pFruits = curFruits;
strcpy(lastpath, path);
}
else if(curstep + 1 == *pstep)
{
*pFruits = *pFruits > curFruits ? *pFruits : curFruits;
strcpy(lastpath, path);
}
}
}
int main()
{
char curpath[100] = {0};
char lastpath[100] = {0};
int data[N][N] = {0};
int MomPos[2] = {0}; //定义妈妈在地图中的位置
int steps = N * N + 1;
int fruits = 0;
int curstep = 0;
int curFruits = 0;
readAlldata(data);
FindMomPos(data, MomPos); //遍历地图找妈妈的位置
recursive(data, MomPos, curstep, &steps, curFruits, &fruits, curpath, lastpath); //递归找宝宝,找的同时不断修改最少步数和糖果数
printf("%d\n", steps == N * N + 1 ? -1 : fruits);
printf("%s\n", lastpath);
return 0;
}
*/