题目描述
输入输出格式
输入格式:共两行。第一行为铁盘个数N(1<=N<=50),第二行为N个不同的正整数,分别为从上到下的铁盘的半径R。(1<=R<=100)
输出格式:一个正整数,表示使铁盘从小到大有序需要的最少翻转次数。
输入输出样例
输入样例#1:
5 2 4 3 5 1
输出样例#1:
反转操作
20分 裸搜
100分 迭代加深搜索
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; }
#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); }