写在前面:
我是一个小小的程序员,我的野心是成为一个全栈工程师!!!
正文:
这是我用来记录学习算法的一个系列。希望能与所有人共进步。
这个算法小心一点,有点绕脑
/********************************
*
* 算法:三色旗
*
* 问题: 假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您
* 希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上
* 进行这个动作,而且一次只能调换两个旗子。
*
* 解决: 在一个绳子上移动,从开头起,以白旗为中心,遇到蓝旗就放白旗左边,红旗放右边。。
*
*
*
*
*
*
********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Blue 'B'
#define White 'W'
#define Red 'R'
int main()
{
char color[] = {'W','R','W','B','W','B','W','R','B','B','W'}; //这是绳子上的旗子们..
//wFlag 表示白旗的位置,bFlag表示蓝旗的位置,rFlag表示红旗的位置,设定白旗和蓝旗从最左边开始,红旗位置从最右边开始
int wFlag = 0,bFlag = 0,rFlag = strlen(color)-1;
int i;
printf("排序前绳子上的旗子顺序为:");
for(i=0;i<strlen(color);i++)
printf("%c ",color[i]);
printf("\n");
//排序
//因为最后以白旗为中心,红旗在白旗的右边,所以当白旗的位置还未大于红旗的位置时,表示旗子还没排好
while(wFlag <= rFlag) {
if(color[wFlag] == White) //如果是白旗
wFlag++; //则白旗阵营+1,位置向前移后一位
else
if(color[wFlag]==Blue) {//如果是蓝旗
swap(&color[bFlag], &color[wFlag]);//则将蓝旗放在白旗左边
wFlag++;bFlag++; //同时分别+1
} else {//如果是红旗
while(wFlag<rFlag && color[rFlag]==Red) //如果最右边这个是红旗,则不用交换旗子的位置
rFlag--; //红旗的位置向前移动一位
swap(&color[rFlag],&color[wFlag]); //此时把前面的红旗和绳子另一端的红旗前一个位置对掉
rFlag--; //此时红旗又向前移动一位
}
}
printf("排序后绳子上的旗子排序为:");
for(i=0;i<strlen(color);i++)
printf("%c ",color[i]);
printf("\n");
return 0;
}
/**
* 交换位置函函数
*
*/
void swap(char* x , char* y) {
char temp;
temp = *x;
*x = *y;
*y = temp;
}
提示:如果不能很好的理解其中的运算过程,就自己按照给出的解决方法手动排一遍
小尾巴:
吾王剑之所指,即吾等身之所向。