これは私の問題への最初のソリューションです
多くのことを許してください。
質問は、実際には配列を使用していません
n = 3の場合で見てみましょう:
オリジナル:
123 456
4 1 5 2 6 3
2 4 6 1 3 5
1 2 3 4 5 6
私たちは、観察位置に行ってきました2
第一の位置:2
第二の位置:4
第三位:1
あなたが直接2によって、私たちは4の2の倍数で見つかったことができるように2は、カードスタックの最初の半分であるため、
後半スタックカード4は、その後* 2をその位置(4-3)を見つける--4-3上述した第1のカードに対応し、リアカードの前方にどの対応するカードであることが判明しました位置は-1、それゆえ、それは私のアプローチは権利であるので、私たちは1であることが判明した回数、確かに正解である(4-3)2-1 *です
私たちは、このプログラムを実行します
私は、このようなA式に来て、シミュレートするために使用しました
if(i>n)i=(i-n)*2-1;//如果它在后半堆,找到它对应的前面的牌,算出它对应的前面的牌的位置,再-1
else i=i*2;//如果它在前半堆,直接乘以2
だから、ACコード
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,i=1,s=0;//只要第1张牌回到了初始位,整付牌就回到了初始状态
cin>>n;//读入
do{
if(i>n)i=(i-n)*2-1;//如果它在后半堆,找到它对应的前面的牌,算出它对应的前面的牌的位置,再-1
else i=i*2;//如果它在前半堆,直接乘以2
s++;
}while(i!=1);
cout<<s;
return 0;
}