洛谷P2534 [AHOI2012]铁盘整理

P2534 [AHOI2012]铁盘整理

题目描述

输入输出格式

输入格式:

共两行。第一行为铁盘个数N(1<=N<=50),第二行为N个不同的正整数,分别为从上到下的铁盘的半径R。(1<=R<=100)

输出格式:

一个正整数,表示使铁盘从小到大有序需要的最少翻转次数。

输入输出样例

输入样例#1:
5
2 4 3 5 1
输出样例#1:
5
//第一种:使用string.h中的strrev函数,只用于字符串 
#include <iostream>  
#include <cstring>  
using namespace std;  
int main()  
{  
    char s[]="hello";  
    strrev(s);  
    cout<<s<<endl;   
    return 0;  
}  


//第二种:使用algorithm中的reverse函数,也适用于整型数组及其他存储结构 
#include <iostream>  
#include <string>  
#include <algorithm>  
using namespace std;  
  
int main()  
{  
    string s="hello";  
    reverse(s.begin(),s.end());  
    cout<<s<<endl;  
    return 0;  
}   
反转操作
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mod1 2333333
#define mod2 1048577
#define maxn 51
using namespace std;
int n,t[maxn];
struct node{
    int a[maxn],step;
}cur,nxt;
queue<node>q;
bool vis1[2333333],vis2[1048577];
int hash1(int x[]){
    int res=1;
    for(int i=1;i<=n;i++)res=(res*103%mod1+x[i])*13%mod1;
    return res;
}
int hash2(int x[]){
    int res=1;
    for(int i=1;i<=n;i++)res=(res*117%mod2+x[i])*27%mod2;
    return res;
}
int main(){
    freopen("Cola.txt","r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&cur.a[i]),t[i]=cur.a[i];
    sort(t+1,t+n+1);
    int t1=hash1(t),t2=hash2(t);
    if(hash1(cur.a)==t1&&hash2(cur.a)==t2){puts("0");return 0;}
    cur.step=0;
    q.push(cur);
    while(!q.empty()){
        cur=q.front();q.pop();
        for(int i=2;i<=n;i++){
            nxt=cur;
            reverse(nxt.a+1,nxt.a+i+1);
            int h1=hash1(nxt.a),h2=hash2(nxt.a);
            if(h1==t1&&h2==t2){
                printf("%d",cur.step+1);
                return 0;
            }
            if(!vis1[h1]||!vis2[h2]){
                vis1[h1]=1;vis2[h2]=1;
                nxt.step=cur.step+1;
                q.push(nxt);
            }
        }
    }
    return 0;
}
20分 裸搜
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define maxn 51
using namespace std;
int n,a[maxn];
struct node{
    int w,id;
    bool operator < (const node b)const{
        return w<b.w;
    }
}e[maxn];
int get(){
    int res=0;
    for(int i=2;i<=n;i++)
        if(abs(a[i]-a[i-1])!=1)res++;
    return res;
}
void dfs(int limit,int step){
    int h=get();
    if(!h&&a[1]<a[2]){
        printf("%d",limit);
        exit(0);
    }
    if(h+step>limit||step==limit)return;
    for(int i=2;i<=n;i++){
        if(abs(a[i]-a[i+1])!=1){
            reverse(a+1,a+i+1);
            dfs(limit,step+1);
            reverse(a+1,a+i+1);
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&e[i].w),e[i].id=i;
    sort(e+1,e+n+1);
    for(int i=1;i<=n;i++)a[e[i].id]=i;
    a[0]=-0x7f7f7f7f;a[n+1]=0x7f7f7f7f;
    for(int k=0;;k++)dfs(k,0);
}
100分 迭代加深搜索
原文地址:https://www.cnblogs.com/thmyl/p/7687749.html