三旗问题(92)

算法思想:题目要求对给定的一组旗子序列按蓝白红顺序排序,序列中蓝白红分别用B、W、R表示,首先肯定需要一个字符数组存储用户给定序列,其次需要三个"指针"用于遍历序列过程中的交换操作,具体设定b、w、r指针,开始时让b和w指针指向首元素,我们用w来遍历,b指针等到需要交换时才移动,r指向末元素,这样指向的目的在于题目要求的输出序列为蓝白黄,自然指向蓝的指针只有当w指针指向蓝时才会b与w指针交换,白作为中间元素,当用w遍历时如果是白则自动++,以此来保证中间的全是白,b的左边包括b全是蓝,当w为红是自然与r交换,但交换的时候需要记得让r从后往前指向一个非红,然后将w指向的红与r指向非红交换,交换后r自然要-1以便进行下一次的交换,如果r指向的一直为红,则r一直自减到了r等于w时证明结束了,因为此时w指向的也是红,证明序列已经排好了,算法的最外层循环条件应设为w<=r的目的在于当w等于r时处理的是最后一个元素,若只写w<r可能少处理一个元素

#include<stdio.h>
#include<string.h>
int main()
{
	char color[10];
	printf("请输入旗子序列(B、R、W\n");
	gets_s(color);//输入9个字符,因为gets_s函数自动添'\0'
	int w, r, b;
	char temp;
	w = b = 0;
	r = strlen(color) - 1;//r指向最后一个字符
	while (w<=r)//关键点
	{
		if (color[w] == 'w')
		{
			w++;
		}
		else if (color[w] == 'b')
		{
			temp = color[w];
			color[w] = color[b];
			color[b] = temp;
			b++;
			w++;
		}
		else
		{
			while (color[r] == 'r'&&r>w)//关键点
			{
				r--;
			}
			temp = color[r];
			color[r] = color[w];
			color[w] = temp;
			r--;
		}
	}
	printf("%s\n", color);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值