首页 > 其他 > 详细

UVa 120 煎饼堆

时间:2014-03-15 08:38:06      阅读:388      评论:0      收藏:0      [点我收藏+]

思路:flip i操作是从第0个到倒数第i个数颠倒、即对调位置。题目是要求将每组数据进行变换到升序的操作序列。思想是从后到前来排,先排最大的数字到其正确的位置,然后依次。所以,首先要将其排序,找出数字间的顺序关系。然后搜索要排的数字a在现在序列中的位置x,找到该位置后,肯定是进行此位置的flip操作,即flip x,将其变换到首位置,然后再进行一次flip y位置,将首位置的该数据放在y位置。(y假设是倒数y个数,即a应正确放的位置)

注意:对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[N];
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;   
}


UVa 120 煎饼堆,布布扣,bubuko.com

UVa 120 煎饼堆

原文:http://blog.csdn.net/buxizhizhou530/article/details/21260981

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!