【暴力搜索】[UVa 11212]Editing a Book

来源:互联网 发布:程序员必学课程 编辑:程序博客网 时间:2024/06/04 17:42

就是纯暴力,每次枚举起点中点和向后移动的步数,加上if(dif(now) + 3 * (u-1) > 3 * maxd) return false;优化dif(now)表示每一位的后面是否是正确的

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct State{int s[11];};int n, maxd;int dif(State s){    int ret = 0;    for(int i=1;i<n;i++)        if(s.s[i+1]!=s.s[i]+1)            ret++;    if(s.s[n]!=n) ret++;    return ret;}State rret;void move_back(State st, int i, int j, int bk){    for(int k=1; k<= bk; k++) rret.s[i+k-1] = st.s[j+k];    for(int k=i; k<=j; k++) rret.s[k+bk] = st.s[k];}bool dfs(int u, State now){    State tmp;    if(u > maxd) return dif(now) == 0;    if(dif(now) + 3 * (u-1) > 3 * maxd) return false;    int bend;    for(int i=1;i<=n;i++)        for(int j=i;j<=n;j++){            bend = n-j;            for(int back=1;back<=bend; back++){                rret = now;                move_back(now, i, j, back);tmp = rret;                if(dfs(u+1, tmp)) return true;            }        }    return false;}int main(){    int ccnt=0;State be;    while(scanf("%d", &n)!=EOF && n){        for(int i=1;i<=n;i++) scanf("%d", &be.s[i]);        maxd = 0;        while(!dfs(1, be)) maxd++;        printf("Case %d: %d\n",++ccnt, maxd);    }    return 0;}
0 0
原创粉丝点击