我想模拟游戏":
从一组n个不同的牌开始,比如一个向量(1 2 ... n)。将它分成两个同样大的半底,保持初始顺序;如果n是奇数,则将其分开(1 2 ...(n-1)/ 2)和((n + 1)/ 2(n + 1)/ 2 + 1 ... n)。
然后将它们混合在一起,使新甲板上最远的卡片位于第一个半月底最远的地方,然后将第二个半月底的最下方,然后是第一个半个最下方的第二个,依此类推。如果n是奇数,则得到:
((n + 1)/ 2(n + 1)/ 2 + 1 1(n + 1)/ 2 + 2 2(n + 1)/ 2 + 3 3 ... n(n-1) / 2)。
然后应该重复这一步。 "游戏"是找到需要多少次迭代才能回到初始设置(好吧,假设它总是发生,似乎就是这种情况)。我已经编写了这个程序,但它陷入了无限循环。它有什么问题?如果没有错误,它应该很容易返回move = 3,例如n = 3。
n=input('How many cards in total?\n');
v=zeros(1,n);
i=1;
moves=0;
for i=1:n
v(i)=i;
end
w=v;
if mod(n,2)==0
for i=1:2:n-1
v(i)=w(n/2+(i+1)/2);
end
for i=2:2:n
v(i)=w(i/2);
end
moves=moves+1;
else v(1)=w((n+1)/2);
for i=3:2:n
v(i)=w((i-1)/2);
end
for i=2:2:n-1
v(i)=w((n+1)/2+i/2);
end
moves=moves+1;
end
tf=isequal(v,w);
while(tf==0)
if mod(n,2)==0
for i=1:2:n-1
v(i)=w(n/2+(i+1)/2);
end
for i=2:2:n
v(i)=w(i/2);
end
moves=moves+1;
else
v(1)=w((n+1)/2);
for i=3:2:n
v(i)=w((i-1)/2);
end
for i=2:2:n-1
v(i)=w((n+1)/2+i/2);
end
moves=moves+1;
end
tf=isequal(v,w);
end
答案 0 :(得分:0)
我不会100%得到你正在尝试的东西,但我认为基本上你忘记更新“洗牌”套牌。您需要前一个套牌,当前套牌和目标套牌,但是您将前一个和目标套牌用作单个变量w
,但从未真正更新它。
如果您声明变量init
,并替换w
中的tf=isequal(v,init);
,请在其后添加额外的行以更新前一个套牌w=v;
,那么此代码不会不会陷入无限循环。