首页 > 代码库 > 九度OJ;题目1146:Flipping Pancake
九度OJ;题目1146:Flipping Pancake
题目链接地址:http://ac.jobdu.com/problem.php?pid=1146
转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/42014265
因为问题只要求2n-3次,并没有别的要求,所以最简单一个思想就是没一次循环完成一个目标就是把当前最大的放到最后,那么第一步就是先经过旋转把当前最大的放在数组最前面,第二步就是旋转到对应位置
#include <stdio.h> using namespace std; void change(int num,int *A,int m) { int left=1,tmp; while(left<m) { tmp=A[left]; A[left]=A[m]; A[m]=tmp; left++; m--; } } void display(int *A,int num) { for(int i=1;i<=num;i++) printf("%d ",A[i]); printf("\n"); } int main() { //freopen("data.in","r",stdin); int num,A[31],B[100]; while(scanf("%d",&num)!=EOF&&num!=0) { int index=0; for(int i=1;i<=num;i++) scanf("%d",&A[i]); for(int i=num;i>=1;i--)//找最大的; { if(A[i]==i)//如果已经在最后了,那么就不需要旋转; continue; if(A[1]!=i)//如果目前最大的不在最前,则需要旋转一次,把最大的放到第一个; { for(int j=2;j<=num;j++) { if(A[j]==i) { change(num,A,j); //display(A,num); B[index++]=j; } } } change(num,A,i); //display(A,num); B[index++]=i; } printf("%d",index); for (int i=0;i<index;i++) { printf(" %d",B[i]); } printf("\n"); } return 0; } /************************************************************** Problem: 1146 User: vincent_ynh Language: C++ Result: Accepted Time:0 ms Memory:1020 kb ****************************************************************/
九度OJ;题目1146:Flipping Pancake
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。