UVa 120 煎饼堆
2014-03-15 00:49
232 查看
思路:flip i操作是从第0个到倒数第i个数颠倒、即对调位置。题目是要求将每组数据进行变换到升序的操作序列。思想是从后到前来排,先排最大的数字到其正确的位置,然后依次。所以,首先要将其排序,找出数字间的顺序关系。然后搜索要排的数字a在现在序列中的位置x,找到该位置后,肯定是进行此位置的flip操作,即flip x,将其变换到首位置,然后再进行一次flip y位置,将首位置的该数据放在y位置。(y假设是倒数y个数,即a应正确放的位置)
注意:对x需要判断是否为0,即是否已经在首位置,是的话就不用再变换到首位置这一步了。以及,在开始时,
Code:
注意:对x需要判断是否为0,即是否已经在首位置,是的话就不用再变换到首位置这一步了。以及,在开始时,
Code:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #define N 100 int cmp_int(const void *_a, const void *_b); int search(int* a, int n, int d); void revs(int *a, int j); char temps ; int a[N/2]; int b[N/2]; int main() { while(fgets(temps,N-1,stdin)!=NULL) { int len=strlen(temps); char snum[5]; int n=0; for(int i=0,j=0;i<len;++i) { if(isdigit(temps[i])) { snum[j++]=temps[i]; } else { snum[j]='\0'; j=0; a[n++]=atoi(snum); } }//for for(int i=0;i<n;++i) printf("%d ",a[i]); printf("\n"); for(int i=0;i<n;++i) b[i]=a[i]; qsort(b,n,sizeof(int),cmp_int); for(int i=n-1;i>=0;--i) {//遍历b数组 int j=search(a,n,b[i]); if(j==i) continue;//该元素恰在正确位置 if(j!=0) { printf("%d ",n-j); revs(a,j); } printf("%d ",n-i); revs(a,i); } printf("0\n"); }//while //system("pause"); return 0; } void revs(int *a, int j) {//printf("%d\n",j); for(int i=0;i<=j/2;++i) { int k=a[i]; a[i]=a[j-i]; a[j-i]=k; } } int search(int* a, int n, int d) { for(int i=0;i<n;++i) { if(a[i]==d) return i; } return n; } int cmp_int(const void *_a, const void *_b) { int* a=(int*)_a; int* b=(int*)_b; return *a-*b; }
相关文章推荐
- php递归数组中的应用
- 内存模型之白话入门
- Python 3.3 入门教程
- 利用MAVEN打包spark工程,运行时报错No FileSystem for scheme: file的问题
- 面试题总结-processbar
- VS2012不显示最近打开项目的问题
- 带着枷锁跳舞
- leetcode: Next Permutation
- 一些大型工具软件的设计思想
- tableview概述
- 翻译新坑,管挖不管埋。
- Mark挖掘到的论文
- maven 拷贝jar命令
- ListView 加载更多列表 Load More mono forandroid 项目笔记
- Eclipse C/C++开发环境搭建----Window版
- HBase安装配置之伪分布式模式
- 5个必须掌握的maven命令
- eclipse开发android程序 自动提示内容为空
- 《Python入门经典 以解决计算问题为导向的Python编程实践》Lesson2
- ar和nm命令的使用 和简单介绍