ICPC 2015 北京 Today Is a Rainy Day
生活随笔
收集整理的這篇文章主要介紹了
ICPC 2015 北京 Today Is a Rainy Day
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:https://vjudge.net/problem/UVALive-7263
或者:http://hihocoder.com/problemset/problem/1251
?
?
題目大意:給你兩個字符串,問你從一個變成另一個的最少變化次數。變化規則有二,一是將某一字符變成另一個字符,二是將某一類字符變成另一類字符,都算變化一次。
?
題解:首先有一個彎要轉過來,就是先進行第二種變化,再進行第一種變化。我們首先暴力出所有的變化的可能性,以及變過去需要的變化次數,然后再進行變化一,加上變化一的次數。
比如:
初始: 1 2 3 4 5 6
目標: 1 2 3 3 6 5
表示的變化是所有初始中的4最后變成3,所有初始中的5最后變成6,所有初始中的6最后變成5,通過BFS搜出最少變化次數為4,即依次為:4變3,6變4,5變6,4變5。然后再遍歷字符串進行變化一。
代碼:
?
#include <bits/stdc++.h> #define N 50000 using namespace std;void turn_to(int x,int *a) //10進制變6進制 {for (int i=5;i>=0;i--,x/=6) a[i]=x % 6; } int turn_back(int *a) //6進制變10進制 {int t=0;for (int i=0;i<6;i++)t=t*6+a[i];return t; }int f[N]; string a,b; int G[10][10],r[10]; queue<int>q;void presolve() //BFS最小變化次數 {while (!q.empty())q.pop();int a[10]={0,1,2,3,4,5},c[10];int t=turn_back(a);memset(f,0x3f,sizeof f);f[t]=0;q.push(t);while (!q.empty()){int x=q.front();q.pop();turn_to(x,a);for (int i=0;i<6;i++)for (int j=0;j<6;j++) //暴力所有可能的變化{memcpy(c,a,sizeof a);for (int k=0;k<6;k++) if (c[k]==i) c[k]=j; //將當前狀態中的所有i變為jt=turn_back(c);if (f[t]>f[x]+1){f[t]=f[x]+1;q.push(t);}}} }int main() {int x[10];presolve();while(cin>>b>>a){memset(G,0,sizeof G);memset(r,0,sizeof r);for (int i=0;i<a.length();i++){int u=a[i]-'1',v=b[i]-'1';r[u]++;G[u][v]++;}int ans=1e8;for (int i=0;i<N-10;i++) //枚舉所有變化{int t=f[i];turn_to(i,x);for (int j=0;j<6;j++) t+=r[j]-G[j][x[j]]; //變化一ans=min(ans,t);}printf("%d\n",ans);} }?
?
?
總結
以上是生活随笔為你收集整理的ICPC 2015 北京 Today Is a Rainy Day的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 14.Nor-Flash操作实例
- 下一篇: linux中的本地化