这是一道一开始就没做出来的题,到现在了,结合LRJ的思路,做出来了,但是代码写的还是不易懂,思路乱,我太菜了。
其实发现规律就两步:1.找出指针前面的最大值及其位置, 2.把刀放在最大值后面并进行颠倒操作(如果最大值位于首部则不颠倒) 3.把刀放在指针处进行颠倒操作
每一步都要检查是否完成,及时推出。
#include<stdio.h>
#include<iostream>
#include<string>
#include<sstream>
#include<string.h>
using namespace std;
int bing[35],temp[35];
int main()
{
string str;
while(getline(cin,str))
{
stringstream ss(str);
int num = 0;
while(ss>>bing[num++]) //一共num个数,下标从0到num - 1
{
if(num == 1) printf("%d",bing[num - 1]);
else printf(" %d",bing[num - 1]);
}
printf("\n");
num--;
for(int i = 0,j = num - 1;i < num;i++,j--) //旋转数字
temp[i] = bing[j];
for(int i = 0;i < num;i++)
bing[i] = temp[i];
int zhizhen = 0,kase = 0; //zhizhen是没有被冻结的数字下标
while(1)
{
int flag = 1;
for(int i = 1;i < num;i++)
if(bing[i] > bing[i - 1]) {flag = 0;break;}
if(flag) break;
int maxn = bing[zhizhen],maxnxia = zhizhen;
for(int i = zhizhen;i < num;i++) //找出最大值
if(bing[i] > maxn)
{maxn = bing[i];maxnxia = i;}
if(maxnxia != num - 1) //开始第一次颠倒!
{
memset(temp,0,sizeof(temp));
if(!kase)
{printf("%d",maxnxia + 1);kase++;}
else printf(" %d",maxnxia + 1);
for(int i = maxnxia,j = num - 1;i < num;i++,j--)
temp[j] = bing[i];
for(int i = maxnxia;i < num;i++)
bing[i] = temp[i];
memset(temp,0,sizeof(temp));
flag = 1;
for(int i = 1;i < num;i++)
if(bing[i] > bing[i - 1]) {flag = 0;break;}
if(flag) break;
}
if(!kase)
{printf("%d",zhizhen + 1);kase++;}
else printf(" %d",zhizhen + 1);
for(int i = zhizhen,j = num - 1;i < num;i++,j--)
temp[j] = bing[i];
for(int i = zhizhen;i <num;i++)
bing[i] = temp[i];
flag = 1;
for(int i = 1;i < num;i++)
if(bing[i] > bing[i - 1]) {flag = 0;break;}
if(flag) break;
zhizhen++;
}
if(kase) printf(" 0\n");
else printf("0\n");
}
return 0;
}