主题:6道编程题(做出一道加10分)
LSQ
[专家分:220] 发布于 2006-05-21 21:14:00
(1)从键盘输入两个自然数N,R(N>R),要求输出从N到1中按降序顺序取R个自然数的所有组合和个数。
例如: 输入: N=5,R=3
输出: 543,542,541,532,531,521,432,431,421,321
Total=10
(2)有3N个花盆,红色、蓝色、黄色各N个,按任意顺序排成一行。编程将各花盆按红、黄、蓝;红、黄、蓝;……红、黄、蓝的顺序排列,且要求花盆之间交换的次数最少。数字1表示红花盆,2表示黄花盆;3表示蓝花盆。要求输出每次交换后的状态和最少交换的次数。
(3)有2N十1个方格,左、右两边各放N个“+”子和N个“*”子。
例如N=4时,如下图所示:
|+|+|+|+| |*|*|*|*| ' "|"用来分栏," "表示一个空格
试编程打印出用最少步数将上图中的“+”子和“。”子的位置进行交换的步骤。
移动规则如下:
l)一次只能移动一个棋子;
2)棋子可以向空格中移动,也可以跳过对方的一个棋子进人空格,但不能向后跳,也不能跳过两个棋子。
(4)有N枚硬币,将其按1,2,3,…,N编号排列(N>2),且正面都朝上。现从硬币2开始把编号为2的倍数的硬币翻一个面,再从硬币3开始把编号为3的倍数的硬币翻一个面,接着从硬币4开始把编号为4的倍数的硬币翻一个面。如此类推。直到最后将N号硬币翻一个面。问最后哪些硬币为正面朝上。编程,当从键盘输人N后,则输出结果是哪些硬币。
(5)某人去书店买书,他选中了六本书,价格分别为A、B、C、D、E、F,但他只带了50元钱。问怎样买法使总钱数最接近50元。A、B、C、D、E、F均由键盘输入。
(6)火车从始发站(称为第1站)开出,在始发站上车的人数为A;然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为A人。从第3站起(包括第3站)上、下车的人数有一定的规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第N-1站),都满足此规律。现给出的条件是:共有N个车站,始发站上车的人数为A,最后一站下车的人数是M(全部下车)。请编程求出从X站开出时车上的人数是多少?输入为:A,N,M和X(N,X均小于23);输出为:X站开出时车上的人数。
回复列表 (共20个回复)
11 楼
hubjiang8 [专家分:0] 发布于 2006-06-06 17:00:00
[quote]算了,一并说吧,
第一题在穷举的过程的加多个限制条件.
第三题,如果你不想穷举,那么就要采取每次对每种情况进行策略,刚巧以前解过这题,
#include <iostream.h>
const int Max=11; //数字随你改2N+1
int t[Max];
int count=0;
void Init()
{
for (int i=0; i<Max/2; i++)
{
t[i]=-1;
t[Max-i-1]=1;
}
}
void output()
{
for (int i=0; i<Max; i++)
{
if (t[i]==-1) cout<<"a ";
else if (t[i]==1) cout<<"b ";
else cout<<" ";
}
cout<<endl;
}
void change(int a, int b)
{
int temp=t[a];
t[a]=t[b]; t[b]=temp;
}
int condition()
{
int sum1=0, sum2=0;
for (int i=0; i<Max/2; i++)
{
sum1+=t[i];
sum2+=t[Max-i-1];
}
if ( (sum1 == Max/2) && (sum2 == -sum1))
return 0;
return 1;
}
void a_jump(int &flag)
{
for (int i=0; i<Max-2; i++)
if ( t[i]==-1 && t[i+1]==1 && t[i+2]==0 )
{ change(i,i+2); output(); count++; flag=0;}
}
void b_jump(int &flag)
{
for (int i=0; i<Max-2; i++)
if ( t[i]==0 && t[i+1]==-1 && t[i+2]==1 )
{ change(i,i+2); output(); count++; flag=0;}
}
void a_move(int &flag)
{
for (int i=0; i<Max-1; i++)
if ( t[i]==-1 && t[i+1]==0 && (i==0 || t[i-1]!=t[i+2] ))
{ change(i, i+1); output(); count++; flag=0;}
}
void b_move(int &flag)
{
for (int i=0; i<Max-1; i++)
if ( t[i]==0 && t[i+1]==1 && (i==Max-2 || t[i-1]!=t[i+2] ))
{ change(i, i+1); output(); count++; flag=0;}
}
void fun()
{
Init();
output();
int i, flag;
while( condition() )
{
flag=1;
if (flag) a_jump(flag);
if (flag) b_jump(flag);
if (flag) b_move(flag);
if (flag) a_move(flag);
}
cout<<Max-1<<"个字母时,"<<endl;
cout<<"一共最少需移动"<<count<<"次"<<endl;
}
void main()
{
fun();
}
第四题和第六题模拟其程,第六题在模拟后可采取枚举的方法求解.
第五题用动态规划.[/quote]
12 楼
游戏之王 [专家分:540] 发布于 2007-04-04 17:11:00
(1)
DECLARE SUB jx (i)
CLS
DIM SHARED n, m, S
INPUT "N,M="; n, m '在N个元素中选M个数组合
DIM SHARED A(n)
S = 0
jx (1)
PRINT S
END
SUB jx (i)
FOR j = i TO n
A(i) = j: F = -1
FOR K = 1 TO i - 1
IF j <= A(K) THEN F = 0: EXIT FOR '如果此元素比之前元素小或相等,则不要
NEXT K
IF F THEN
IF i < m THEN '如果不满数,就用递归再找下一个元素
jx (i + 1)
ELSE '如果满数,就输出一趟组合
S = S + 1
FOR K = 1 TO m
PRINT A(K);
NEXT K: PRINT ,
END IF
END IF
NEXT j
END SUB
(2)
CLS
N = 3
DIM A(100)
FOR I = 1 TO N: INPUT A(I): S = S + A(I): NEXT I
P = S / N: A = 1: B = N
FOR I = 1 TO N: A(I) = A(I) - P: NEXT I
WHILE A < N AND A(A) = 0: A = A + 1: WEND
WHILE B > 0 AND A(B) = 0: B = B - 1: WEND
WHILE A < B
A(A + 1) = A(A + 1) + A(A): A(A) = 0: A = A + 1: K = K + 1
WHILE A < N AND A(A) = 0: A = A + 1: WEND
WEND
PRINT K
END
(3)
(4)
(5)
(6)
CLS
INPUT A
INPUT N
INPUT M
INPUT X
DIM A(N), B(N), X(N)
A(1) = A: B(1) = 0: X(1) = A: X(2) = A
DO
S = S + 1
A(2) = S: B(2) = 2
FOR I = 3 TO N - 1
A(I) = A(I - 1) + A(I - 2)
B(I) = A(I - 1)
X(I) = X(I - 1) + A(I) - B(I)
NEXT I
IF X(N - 1) = M THEN PRINT X(X): END
LOOP
END
13 楼
小精灵LS [专家分:580] 发布于 2007-04-04 17:25:00
(2)
cls
input n
for i=1 to n:a(i)=1:next i
for i=2 to n
for j=i to i*i step i
a(j)=1-a(j)
next j,i
for i=1 to n:print a(i):next i
end
14 楼
Matodied [专家分:7560] 发布于 2007-04-18 22:04:00
我只会1、4、5、6题,下面给出四道题的程序,还有,你说好每道题10分的,40分可一分不能少啊!
第1题:
CLS
INPUT n, r
DIM a(r): FOR i = 1 TO r: a(i) = i: NEXT i
DO
s = s + 1: FOR j = 1 TO r: PRINT n + 1 - a(j); : NEXT j
i = r: PRINT
DO
a(i) = a(i) + 1
IF i < r THEN FOR j = i + 1 TO r: a(j) = a(j - 1) + 1: NEXT j
IF a(i) <= n + i - r THEN EXIT DO
i = i - 1
IF i = 0 THEN PRINT "Total:"; s: END
LOOP
LOOP
END
15 楼
Matodied [专家分:7560] 发布于 2007-04-18 22:08:00
第二题:
CLS
INPUT n
DIM a(n): FOR i = 1 TO n: a(i) = 1: NEXT i
FOR i = 1 TO n
FOR j = i TO n STEP i
a(j) = 1 - a(j)
NEXT j
NEXT i
FOR i = 1 TO n
IF a(i) = 1 THEN PRINT i;
NEXT i
END
16 楼
Matodied [专家分:7560] 发布于 2007-04-18 22:12:00
刚才我说错了,应该是第4题.
17 楼
V2战警2 [专家分:390] 发布于 2007-07-26 17:54:00
no.1
input N,R
if N>207 or R>N then end
for i=1 to N
s$=chr$(48+i)+s$
next
s1$=right$(s$,R)
s2$=s1$
do
c=c+1
print s2$,
s2$=nextzh$(s$,s2$)
loop until s2$=s1$
print "Total:"; c
end
function nextzh$(a$,b$)
for i=1 to len(b$)
if instr(1,a$,mid$(b$,i,1))>i then
mid$(b$,1,i)=mid$(a$,instr(1,a$,mid$(b$,i,1))-i,i)
exit for
endif
next
if i>len(b$) then b$=right$(a$,len(b$))
nextzh$=b$
end function[/quote]
18 楼
V2战警2 [专家分:390] 发布于 2007-07-26 17:55:00
no.2
defint a-z
randomize timer
n = 25 * rnd + 2
s$ = space$(3 * n)
for i = 1 to 3
for j = 1 to n
do
k = 3 * n * rnd + 1
if k > 3 * n then k = 3 * n
if mid$(s$,k,1)=chr$(32)then mid$(s$,k,1)=chr$(48+i)else k=-1
loop while k = -1
next
next
cls
print s$
for i = 1 to 3 * n
a = val(mid$(s$, i, 1))
if (a mod 3) <> (i mod 3) then
q = q + 1
for j = i + 1 to 3 * n
b = val(mid$(s$, j, 1))
if ((b mod 3) <> (j mod 3)) then
e = j
if (b mod 3) = (i mod 3) then exit for
end if
next
c$ = mid$(s$, e, 1)
mid$(s$, e, 1) = mid$(s$, i, 1)
mid$(s$, i, 1) = c$
print s$
end if
next
print q[/quote]
19 楼
lml1996 [专家分:30] 发布于 2007-07-27 12:16:00
我来回复