三色旗

来源:互联网 发布:淘宝代理怎么做步骤 编辑:程序博客网 时间:2024/04/26 23:47

一条绳子挂红白蓝三种颜色的旗子,且排列无序,现用程序把三种旗子同色归类,顺序为红-白-蓝,每次只能交换2面旗子。

/*红-白-蓝首先排蓝色,left和right分别自左往右,自右往左,left的目的是找到b,right的目的是找到非b(即w或r),然后交换,这样可以把b都找到放在绳的最左边。那么问题简化为排序红-白。接着开始排序白,和上同理。*/#include<iostream>using namespace std;void Swap(char&, char&);void Change(char*, int, int&, char);int main(){char ch[100];while (cin >> ch){int left = 0;int right = strlen(ch) - 1;int length = right + 1;Change(ch, left, right, 'b');//一个引用,一个不是引用,关键就在这两句代码Change(ch, left, right, 'w');for (int i = 0; i < length; i++){cout << ch[i];cout << ((i == length - 1) ? "\n" : " ");}}return 0;}void Swap(char &x, char &y){char temp;temp = x;x = y;y = temp;}void Change(char* p, int left, int& right,char base)//注意这里的left不是引用,而right是引用{while (left < right){while (left < right&&p[right] == base)right--;while (left < right&&p[left] != base)left++;Swap(p[right], p[left]);}}


#include <stdio.h>#include <stdlib.h>#include <string.h>#define BLUE 'b'#define WHITE 'w'#define RED 'r'#define SWAP(x,y) { char temp; \temp = color[x]; \color[x] = color[y]; \color[y] = temp; }int main(){char color[] = { 'r', 'w', 'b', 'w', 'w','b', 'r', 'b', 'w', 'b', '\0' };int wFlag = 0;int bFlag = 0;int rFlag = strlen(color) - 1;int i;for (i = 0; i < strlen(color); i++)printf("%c ", color[i]);printf("\n");while (wFlag <= rFlag) {if (color[wFlag] == WHITE)wFlag++;else if (color[wFlag] == BLUE){SWAP(bFlag, wFlag);bFlag++; wFlag++;}else {while (wFlag < rFlag && color[rFlag] == RED)rFlag--;SWAP(rFlag, wFlag);rFlag--;}}for (i = 0; i < strlen(color); i++)printf("%c ", color[i]);printf("\n");return 0;}



0 0
原创粉丝点击