算法|趣味算法-青蛙过河
趣味编程-青蛙过河:
两队青蛙,河左边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("<- ");
else
printf("O ");
}
printf("\n\n");
}void swap(int *nN1, int *nN2)
{
int nTmp = 0;
nTmp = *nN1;
*nN1 = *nN2;
*nN2 = nTmp;
}// left side the number is less than 0
// right side the number is bigger than 0
// empty grid is 0
int move_frog(int arrRoad[], int nLen, int nEmptyGrid)
{
int i = 0;
intbMove = 1;
int nSuccessCount = 0;
// move the left side
while(nSuccessCount < nLen - 1)
{
bMove = 1;
for (i = 0 ;
i < nEmptyGrid && bMove;
i++)
{
if ((arrRoad[nEmptyGrid-2] < 0) && (arrRoad[nEmptyGrid-1] > 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)
推荐阅读
- 画解算法(1.|画解算法:1. 两数之和)
- Guava|Guava RateLimiter与限流算法
- 一个选择排序算法
- SG平滑轨迹算法的原理和实现
- 《算法》-图[有向图]
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- 虚拟DOM-Diff算法详解
- 《数据结构与算法之美》——队列
- 《吃掉那只青蛙》第一章
- 算法回顾(SVD在协同过滤推荐系统中的应用)