求代码,能稍微讲解下最好-pg电子官方
一、求代码,能稍微讲解下最好
第二题,手打
using namespace std;
int a[999][999];
int main()
{
int n,i,j,k,x,y;
cin>>n;
x=1;y=1;k=1;
a[x][y]=k;
for(i=1;i<=n*n;i )
{ if(a[x 1][y]==0&&a[x][y-1]==0&&y-1>=1){y--;a[x][y]=k 1;k ;}
else if(a[x 1][y]==0&&x 1<=n){x ;a[x][y]=k 1;k ;}
else if(a[x][y 1]==0&&y 1<=n){y ;a[x][y]=k 1;k ;}
else if(a[x-1][y]==0&&x-1>=1){x--;a[x][y]=k 1;k ;}
else if(a[x][y-1]==0&&y-1>=1){y--;a[x][y]=k 1;k ;}
}
for(i=1;i<=n;i )
{
cout
二、代号17的介绍
代号17是个悲剧结局,小光最后死了,
三、求vb编码:17人围成一圈,编号为1,2,3…,17,从第1号开始报数,报到3的倍数的人离开,一直数下去,直到最后剩下1人,求此人的编号。
private sub form_activate()
dim temp() as integer, arr() as integer, n as integer, m as integer, i as integer
redim arr(1 to 17)
for i = 1 to 17
arr(i) = i
next
do until ubound(arr) = 2
for i = 1 to ubound(arr)
if i mod 3 = 0 then
arr(i) = 0
n = n 1
end if
next
redim temp(1 to ubound(arr) - n)
for i = 1 to ubound(arr) - ubound(arr) mod 3
if arr(i) <> 0 then
m = m 1
temp(m ubound(arr) mod 3) = arr(i)
end if
next
m = 0
for i = ubound(arr) - ubound(arr) mod 3 1 to ubound(arr)
m = m 1
temp(m) = arr(i)
next
redim arr(1 to ubound(temp))
for i = 1 to ubound(arr)
arr(i) = temp(i)
next
m = 0: n = 0
loop
msgbox arr(2) & 胜出!
unload me
end sub
四、java编程17人编号为0-16围成一圈,0号人开始从1报数,凡是报数为3倍数的人离开圈子,继续到一个,问他编号
这是一个约瑟夫环的问题
解答如下:
依据提议,可以将题目等价变换为:“n(n=17)人编号为0到(n-1)围成一圈,0号人开始从0报数,凡是报数为m-1 (m=3)倍数的人离开圈子,继续到一个,问他编号”
一开始的状态
0,1,2,3,4,5 ..... (n-2), (n-1) 【n个人】
第一个人被踢之后 设第一个被踢的人的编号为k, 则 k = m%n-1 【当n=17,m=3时,k=2。也就是说编号为2的人离开了圈子】
这时候的状态
0, .... (k-1), (k 1) ,(k 2)...(n-2),(n-1) 【(n-1)个人,当n=17,m=3时: 0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16】
将这时候的编号做转换. 因为是围城一个圈子,下一个开始数的是(k 1).所以也可以表示为
(k 1),(k 2) ... (n-2),(n-1),0....(k-1) 【(n-1)个人,当n=17,m=3时: 3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,1】
重新编号。得到:
0,1,2,3,4...(n-3),(n-2)【(n-1)个人】 这个时候 ,这里重新构成了一个约瑟夫环。也就是说,这是一个递推的关系。
这里我们进行了重新编号。那么 (n-1)个人和 n个人之间的编号不一样的。但是两者之间有一定的关系,可以冲新编号推导出老的
公式如下: i' = (i k)%(n-1) 【比如,当n=17,m=3时 . 新的环编号是 (n-2),我要求他在老的环中的编号,那么编号是 i' = ( (n-2) k ) % (n-1) = 17 = 1,就是老的换种编号为1的那一个 】
反过来有 :i = (i' m)%n
有了上面的推断,可以代码如下:
int ysf(int n,int m){
if(n==1){
return 0; //当环内只有一个人的时候,就是他自己
}
return (ysf(n-1,m) m ) % n ;
}
------------------完整代码---------------------
public class test{
public static void main(string[] args){
int a = 17;
int b = 3;
system.out.println(ysf(a,b));
}
static int ysf(int n,int m){
if(n==1){
return 0;
}
return (ysf(n-1,m) m) % n;
}
}