Algorithm-Gossip(4) 三色棋(Three_Color_Flag)
前言
This Series aritcles are all based on the book 《經典算法大全》; 對于該書的所有案例進行一個探究和拓展,并且用python和C++進行實現; 目的是熟悉常用算法過程中的技巧和邏輯拓展。
提出問題
Algorithm Gossip: 三色棋(Three_Color_Flag)
假設數組里面有若干個3種數 (1,2,3)要大的數靠后,小的數靠前,每次只能調換兩個數,問怎么移動讓次數最少。
原題目:繩子上有三種三色的旗, “藍白紅”按照這個順序分離,每次換兩個旗。方案讓最小換的次數。
分析和解釋
在一條繩子上移動,在程式中也就意味只能使用一個陣列,而不使用其它的陣列來作輔助,問
題的解法很簡單,您可以自己想像一下在移動旗子,從繩子開頭進行,遇到藍色往前移,遇到
白色留在中間,遇到紅色往后移,如下所示:
只是要讓移動次數最少的話,就要有些技巧:
- 如果圖中W所在的位置為白色,則W+1,表示未處理的部份移至至白色群組。
- 如果W部份為藍色,則B與W的元素對調,而B與W必須各+1,表示兩個群組都多了一個元素 。
- 如果W所在的位置是紅色,則將W與R交換,但R要減1,表示未處理的部份減1。
注意B、W、R并不是三色旗的個數,它們只是一個移動的指標;什幺時候移動結束呢?一開始
時未處理的R指標會是等于旗子的總數,當R的索引數減至少于W的索引數時,表示接下來的旗
子就都是紅色了,此時就可以結束移動
代碼
c/c++ 實現
#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', 'r', '\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; }python 實現
def printc(color):for i in range(len(color)):print(color[i],end = "")print()color = ['r', 'w', 'b', 'w', 'w','b', 'r', 'b', 'w', 'r'] wFlag = 0; bFlag = 0; rFlag = len(color) - 1printc(color)while(wFlag <= rFlag):if(color[wFlag] == 'w'):wFlag+=1;elif(color[wFlag] == 'b'):color[bFlag],color[wFlag] = color[wFlag],color[bFlag] bFlag+=1; wFlag+=1;else:while(wFlag < rFlag and color[rFlag] == 'r'):rFlag-=1color[rFlag],color[wFlag] = color[wFlag],color[rFlag] rFlag-=1;printc(color)拓展和關聯
有興趣的可以嘗試下,是不是最優解,用動態規劃驗證下。
后記
可以向dp狀態轉變。/后面再深究。
參考書籍
- 《經典算法大全》
- 維基百科
轉載于:https://www.cnblogs.com/actanble/p/6713412.html
總結
以上是生活随笔為你收集整理的Algorithm-Gossip(4) 三色棋(Three_Color_Flag)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: luoguP1463:反素数ant(打表
- 下一篇: Swift UISearchContro