c语言编程青蛙过河问题,趣味算法-青蛙过河

趣味编程-青蛙过河:

两队青蛙,河左边3只,右边3只,青蛙过河要踩着石头,每次移动青蛙最多可以跳过对面的一只青蛙,但必须落在空的石头上。

算法原则:

每次只移动一只青蛙。

1)  检查整个路径左侧青蛙越过右侧青蛙跳到空白石头上的情况;

2)  检查整个路径右左侧青蛙越过左侧青蛙跳到空白石头上的情况;

3)  检查整个路径左侧青蛙可以直接向右移动到空白石头上的情况,并且保证移动后向左的青蛙会与向右的青蛙相邻;

4)  检查整个路径右侧青蛙直接向左移动到空白石头上的情况,并且保证移动后向右的青蛙会与向左的青蛙相邻;

到达对岸时结果 +1;

#include void print_road(int arrRoad[], int nLen)

{

int i = 0;

for (i = 0; i < nLen; i++)

{

if (arrRoad[i] < 0)

printf("-> ");

else if (arrRoad[i] > 0)

printf(" 0))

{

swap(&arrRoad[nEmptyGrid-2], &arrRoad[nEmptyGrid]);

if (nEmptyGrid == nLen - 1)

nSuccessCount++;

nEmptyGrid -= 2;

print_road(arrRoad, nLen);

bMove = 0;

break;

}

}

for (i = nLen-1; i > nEmptyGrid && bMove; i--)

{

if ((arrRoad[nEmptyGrid+2] > 0) && (arrRoad[nEmptyGrid+1] < 0))

{

swap(&arrRoad[nEmptyGrid+2], &arrRoad[nEmptyGrid]);

if (nEmptyGrid == 0)

nSuccessCount++;

print_road(arrRoad, nLen);

nEmptyGrid += 2;

bMove = 0;

break;

}

}

for (i = 0; i < nEmptyGrid && bMove; i++)

{

if ((arrRoad[nEmptyGrid - 1] < 0)

&& (nEmptyGrid < nLen - 2

&& (arrRoad[nEmptyGrid - 2]) != arrRoad[nEmptyGrid+1]))

{

swap(&arrRoad[nEmptyGrid-1], &arrRoad[nEmptyGrid]);

if (nEmptyGrid == nLen - 1)

nSuccessCount++;

print_road(arrRoad, nLen);

nEmptyGrid -= 1;

bMove = 0;

break;

}

}

for (i = nLen-1; i > nEmptyGrid && bMove; i--)

{

if ((arrRoad[nEmptyGrid+1] > 0)

&& (nEmptyGrid > 0

&& arrRoad[nEmptyGrid+2] != arrRoad[nEmptyGrid-1]))

{

swap(&arrRoad[nEmptyGrid+1], &arrRoad[nEmptyGrid]);

if (nEmptyGrid == 0)

nSuccessCount++;

print_road(arrRoad, nLen);

nEmptyGrid += 1;

bMove = 0;

break;

}

}

}

}

int main()

{

int arrTest[7] = {-1,-1,-1,0,1,1,1};

int n = 0;

print_road(arrTest, 7);

move_frog(arrTest, 7, 3);

scanf("%d", &n);

return 0;

}

算法复杂度:

青蛙个数: N

O(N) = N * (N/2)

你可能感兴趣的:(c语言编程青蛙过河问题)