程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> UVA 10716 Evil Straw Warts Live 回文數 貪心

UVA 10716 Evil Straw Warts Live 回文數 貪心

編輯:C++入門知識

題意:給出一串字符串,每次交換相鄰的兩個字符,求到達回文串的最少交換次數。 每次找最外面的兩個字母,如果相同就向內縮進判斷,如果不同,就找到裡面能夠讓兩邊相同的最近的字符,進行交換,然後向內縮進判斷。 調了挺久,以後一定要把算法搞清楚再敲。。。 代碼:


 /* 
 *   Author:        illuz <iilluzen[at]gmail.com> 
 *   Blog:          http://blog.csdn.net/hcbbt 
 *   File:          uva10716.cpp 
 *   Lauguage:      C/C++ 
 *   Create Date:   2013-09-03 23:03:20 
 *   Descripton:    UVA 10716 Evil Straw Warts Live, greed 
 */  
#include <cstdio>  
#include <cstring>  
#define rep(i, n) for (int i = 0; i < (n); i++)  
#define swap(a, b) {int t = a; a = b; b = t;}  
#define mc(a) memset(a, 0, sizeof(a))  
  
const int MAXN = 110;  
int n, len, app[26], cnt;  
char s[MAXN];  
  
void solve(char* a, int l) {  
    if (a[0] == a[l - 1]) return;  
    for (int i = 1; i < l - 1; i++)  
        if (a[i] == a[l - 1]) {  
            for (int j = i; j > 0; j--)  
                swap(a[j], a[j - 1]);  
            cnt += i;  
            return;  
        }  
        else if (a[l - i - 1] == a[0]) {  
            for (int j = l - i - 1; j < l - 1; j++)  
                swap(a[j], a[j + 1]);  
            cnt += i;  
            return;  
        }  
}  
  
int main() {  
    scanf("%d", &n);  
    while (n--) {  
        scanf("%s", s);  
        len = strlen(s);  
        mc(app);  
        rep(i, len) app[s[i] - 'a']++;  
        cnt = 0;  
        rep(i, 26) if (app[i] % 2) cnt++;  
        if (cnt > 1)  
            printf("Impossible\n");  
        else {  
            cnt = 0;  
            rep(i, len / 2)   
                solve(s + i, len - 2 * i);  
            printf("%d\n", cnt);  
        }  
    }  
    return 0;  
}  

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved