当前位置: 代码迷 >> C语言 >> 三色旗问题
  详细解决方案

三色旗问题

热度:470   发布时间:2006-08-31 23:05:01.0
以下是引用soft_wind在2006-8-31 22:47:49的发言:
#include "Stdio.h"
#include "Conio.h"
#define SWAP(x,y) { char temp; \
temp=x; \
x=y; \
y=temp; \
}
int main(void)
{
char color[]="brbrwrwbbrbwb";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b')
i++,j++;
while(color[k]=='r') //跳出循环时的k,color[k]!='r',也就是说该元素已经判断是否是红色
k--;
while(j<=k)
{
if(color[j]=='r')
{
SWAP(color[j],color[k]);//上边的color[k]在此处与color[j]交换,也就是说 color[k]变成color[j],注意color[j]在下一次循环时,还是判断是否是红色。也就是说判断两次是否为红色。
k--;
while(color[k]=='r')
k--;
}
while(color[j]=='w')
j++;
if(color[j]=='b')
{
SWAP(color[j],color[i]);
i++,j++;
}
}
puts(color);
getch();
return 0;
}
加个=号

对了,还有一个问题,还是
条件(3)对于每一个元素而言,测试它是红,是白,还是蓝的工作每种颜色最多只能做一次测试。


----------------解决方案--------------------------------------------------------
当char color[]="wwrrrbr";时,跟踪一下程序,你会发现,那个b被与红色比较了三次。分别在下边的红色部分:
#include "Stdio.h"
#include "Conio.h"
#define SWAP(x,y) { char temp; \
temp=x; \
x=y; \
y=temp; \
}
int main(void)
{
char color[]="brbrwrwbbrbwb";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b')
i++,j++;
while(color[k]=='r')
k--;
while(j<=k)
{
if(color[j]=='r')
{
SWAP(color[j],color[k]);k--;
while(color[k]=='r')
k--;
}
while(color[j]=='w')
j++;
if(color[j]=='b')
{
SWAP(color[j],color[i]);
i++,j++;
}
}
puts(color);
getch();
return 0;
}

----------------解决方案--------------------------------------------------------

您说得没错,呵呵.
再改成这样,您再看看:
#include "Stdio.h"
#include "Conio.h"
#define SWAP(x,y) { char temp; \
temp=x; \
x=y; \
y=temp; \
}
int main(void)
{
char color[]="wwrrrbr";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b')
i++,j++;
while(color[k]=='r')
k--;
while(j<=k)
{
while(color[j]=='w')
j++;
if(j<=k&&color[j]=='b')
{
SWAP(color[j],color[i]);
i++,j++;
}
if(j<=k&&color[j]=='r')
{
SWAP(color[j],color[k]);k--;
while(color[k]=='r')
k--;
}

}
puts(color);
getch();
return 0;
}


----------------解决方案--------------------------------------------------------
有点要划格子的味道,回去想想.
----------------解决方案--------------------------------------------------------
以下是引用soft_wind在2006-9-1 13:21:22的发言:

您说得没错,呵呵.
再改成这样,您再看看:
#include "Stdio.h"
#include "Conio.h"
#define SWAP(x,y) { char temp; \
temp=x; \
x=y; \
y=temp; \
}
int main(void)
{
char color[]="wwrrrbr";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b') //跳处循环时的j,color[j]!=‘b’,也就说与蓝色比较过了
i++,j++;
while(color[k]=='r')
k--;
while(j<=k)
{
while(color[j]=='w')
j++;
if(j<=k&&color[j]=='b') //如果上边的color[j]==‘r’,又要与蓝色比较一次
{
SWAP(color[j],color[i]);
i++,j++;
}
if(j<=k&&color[j]=='r')
{
SWAP(color[j],color[k]);k--;
while(color[k]=='r')
k--;
}

}
puts(color);
getch();
return 0;
}

还是有点问题!
----------------解决方案--------------------------------------------------------
您说得没错,真要那样,还可以再加flag标记,把已经进行颜色比较的置flag[index]=1,未和index颜色比较的标记为flag[index]=0,即把颜色比较转换成标记是否为0的比较,这样就不存在您所说的那个问题了,
不过这样就没多大意思了,只会使效率降低还使空间开销加大。
----------------解决方案--------------------------------------------------------

有点难度

[此贴子已经被作者于2006-9-1 18:33:28编辑过]


----------------解决方案--------------------------------------------------------

#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; \
}

void dutch_flag(char color[])
{
int white = 0;
int blue = 0;
int red = strlen(color) - 1;

while (white <= red)
if (color[white] == WHITE)
white++;
else if (color[white] == BLUE) {
SWAP(blue, white);
blue++, white++;
}
else {
while (white < red && color[red] == RED)
red--;
SWAP(red, white);
red--;
}
}

#include <stdio.h>
#define MAXSIZE 100
int main(void)
{
char flag[MAXSIZE];
printf("\n\nInput a String of Color Tokens (b, w and r)\n");
gets(flag);
dutch_flag(flag);
printf("\nRearranged Flag is :");
printf("\n%s\n", flag);
return 0;
}


----------------解决方案--------------------------------------------------------
惭愧...
这样整合确实要好得多...
----------------解决方案--------------------------------------------------------
  相关解决方案