ACM基础题Word文档下载推荐.docx
- 文档编号:16348419
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:45
- 大小:33.45KB
ACM基础题Word文档下载推荐.docx
《ACM基础题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ACM基础题Word文档下载推荐.docx(45页珍藏版)》请在冰豆网上搜索。
4,'
['
total+1:
2,'
]'
);
fori:
=1tomaxdowrite(a[i]:
3);
write('
'
if(total+1)mod2=0thenwriteln;
inc(total);
end;
functionok(i,dep:
integer):
boolean;
{判断第dep行第i列可放否}
ok:
=false;
if(b[i+dep]=true)and(c[dep-i]=true){and(a[dep]=0)}and
(col[i]=true)thenok:
=true
proceduretry(dep:
integer);
=1tomaxdo{每一行均有max种放法}
ifok(i,dep)thenbegin
a[dep]:
=i;
b[i+dep]:
{/对角线已放标志}
c[dep-i]:
{\对角线已放标志}
col[i]:
{列已放标志}
ifdep=maxthenoutput
elsetry(dep+1);
{递归下一层}
a[dep]:
=0;
{取走皇后,回溯}
b[i+dep]:
=true;
{恢复标志数组}
col[i]:
end;
=1tomaxdobegina[i]:
col[i]:
=2to2*maxdob[i]:
=-(max-1)tomax-1doc[i]:
total:
try
(1);
writeln('
'
total);
end.
【测试数据】
n=8八皇后问题
No.[1]15863724No.[2]16837425
No.[3]17468253No.[4]17582463
No.[5]24683175No.[6]25713864
No.[7]25741863No.[8]26174835
No.[9]26831475No.[10]27368514
No.[11]27581463No.[12]28613574
No.[13]31758246No.[14]35281746
No.[15]35286471No.[16]35714286
No.[17]35841726No.[18]36258174
No.[19]36271485No.[20]36275184
No.[21]36418572No.[22]36428571
No.[23]36814752No.[24]36815724
No.[25]36824175No.[26]37285146
No.[27]37286415No.[28]38471625
No.[29]41582736No.[30]41586372
No.[31]42586137No.[32]42736815
No.[33]42736851No.[34]42751863
No.[35]42857136No.[36]42861357
No.[37]46152837No.[38]46827135
No.[39]46831752No.[40]47185263
No.[41]47382516No.[42]47526138
No.[43]47531682No.[44]48136275
No.[45]48157263No.[46]48531726
No.[47]51468273No.[48]51842736
No.[49]51863724No.[50]52468317
No.[51]52473861No.[52]52617483
No.[53]52814736No.[54]53168247
No.[55]53172864No.[56]53847162
No.[57]57138642No.[58]57142863
No.[59]57248136No.[60]57263148
No.[61]57263184No.[62]57413862
No.[63]58413627No.[64]58417263
No.[65]61528374No.[66]62713584
No.[67]62714853No.[68]63175824
No.[69]63184275No.[70]63185247
No.[71]63571428No.[72]63581427
No.[73]63724815No.[74]63728514
No.[75]63741825No.[76]64158273
No.[77]64285713No.[78]64713528
No.[79]64718253No.[80]68241753
No.[81]71386425No.[82]72418536
No.[83]72631485No.[84]73168524
No.[85]73825164No.[86]74258136
No.[87]74286135No.[88]75316824
No.[89]82417536No.[90]82531746
No.[91]83162574No.[92]84136275
92
对于N皇后:
┏━━━┯━━┯━━┯━━┯━━┯━━┯━━┯━━┓
┃皇后N│4│5│6│7│8│9│10┃
┠───┼──┼──┼──┼──┼──┼──┼──┨
┃方案数│2│10│4│40│92│352│724┃
┗━━━┷━━┷━━┷━━┷━━┷━━┷━━┷━━┛
【题目】排球队员站位问题
┏━━━━━━━━┓图为排球场的平面图,其中一、二、三、四、五、六为位置编号,
┃ ┃二、三、四号位置为前排,一、六、五号位为后排。
某队比赛时,
┃ ┃一、四号位放主攻手,二、五号位放二传手,三、六号位放副攻
┠──┬──┬──┨手。
队员所穿球衣分别为1,2,3,4,5,6号,但每个队
┃四│三│二┃员的球衣都与他们的站位号不同。
已知1号、6号队员不在后排,
┠──┼──┼──┨2号、3号队员不是二传手,3号、4号队员不在同一排,5号、
┃五│六│一┃6号队员不是副攻手。
┗━━┷━━┷━━┛编程求每个队员的站位情况。
【算法分析】本题可用一般的穷举法得出答案。
也可用回溯法。
以下为回溯解法。
【参考程序】
typesset=setof1..6;
vara:
array[1..6]of1..6;
d:
array[1..6]ofsset;
i:
ifnot((a[3]in[2,3,4])=(a[4]in[2,3,4]))then
begin{3,4号队员不在同一排}
write('
number:
fori:
=1to6dowrite(i:
8);
writeln;
weizhi:
=1to6dowrite(a[i]:
proceduretry(i:
s:
sset);
{递归过程i:
第i个人,s:
哪些位置已安排人了}
var
j,k:
forj:
=1to6dobegin{每个人都有可能站1-6这6个位置}
if(jind[i])andnot(jins)thenbegin
{j不在d[i]中,则表明第i号人不能站j位.j如在s集合中,表明j位已排人了}
a[i]:
=j;
{第i人可以站j位}
ifi<
6thentry(i+1,s+[j]){未安排妥,则继续排下去}
elseoutput;
{6个人都安排完,则输出}
end;
=1to6dod[i]:
=[1..6]-[i];
{每个人的站位都与球衣的号码不同}
d[1]:
=d[1]-[1,5,6];
d[6]:
=d[6]-[1,5,6];
{1,6号队员不在后排}
d[2]:
=d[2]-[2,5];
d[3]:
=d[3]-[2,5];
{2,3号队员不是二传手}
d[5]:
=d[5]-[3,6];
=d[6]-[3,6];
{5,6号队员不是副攻手}
try(1,[]);
【题目】把自然数N分解为若干个自然数之和。
【参考答案】
n│total
5│7
6│11
7│15
10│42
100│190569291
varn:
byte;
num:
array[0..255]ofbyte;
word;
procedureoutput(dep:
byte);
varj:
=1todepdowrite(num[j]:
procedurefind(n,dep:
{N:
待分解的数,DEP:
深度}
vari,j,rest:
begin
=1tondo{每一位从N到1去试}
ifnum[dep-1]<
=ithen{保证选用的数大于前一位}
num[dep]:
rest:
=n-i;
{剩余的数进行下一次递归调用}
if(rest>
0)thenbeginfind(rest,dep+1);
end
elseifrest=0thenoutput(dep);
{刚好相等则输出}
num[dep]:
begin{主程序}
inputn:
readln(n);
fillchar(num,sizeof(num),0);
num[0]:
find(n,1);
sum='
【题目】把自然数N分解为若干个自然数之积。
varpath:
array[1..1000]ofinteger;
total,n:
procedurefind(k,sum,dep:
{K:
}
varb,d:
Integer;
ifsum=nthen{积等于N}
write(n,'
='
path[1]);
ford:
=2todep-1dowrite('
*'
path[d]);
writeln;
inc(total);
exit;
ifsum>
nthenexit;
{累积大于N}
forb:
=trunc(n/sum)+1downtokdo{每一种可能都去试}
path[dep]:
=b;
find(b,sum*b,dep+1);
find(2,1,1);
writeln('
readln;
【题目】马的遍历问题。
在N*M的棋盘中,马只能走日字。
马从位置(x,y)处出发,把
棋盘的每一格都走一次,且只走一次。
找出所有路径。
【参考程序】{深度优先搜索法}
constn=5;
m=4;
fx:
array[1..8,1..2]of-2..2=((1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1),
(-2,1),(-1,2));
{八个方向增量}
dep,i:
x,y:
cont:
{统计总数}
a:
array[1..n,1..m]ofbyte;
{记录走法数组}
{输出,并统计总数}
varx,y:
=cont+1;
count='
cont);
fory:
=1tondobegin
forx:
=1tomdowrite(a[y,x]:
{readln;
halt;
procedurefind(y,x,dep:
vari,xx,yy:
=1to8do
xx:
=x+fx[i,1];
yy:
=y+fx[i,2];
{加上方向增量,形成新的坐标}
if((xxin[1..m])and(yyin[1..n]))and(a[yy,xx]=0)then
{判断新坐标是否出界,是否已走过?
a[yy,xx]:
=dep;
{走向新的坐标}
if(dep=n*m)thenoutput
elsefind(yy,xx,dep+1);
{从新坐标出发,递归下一层}
a[yy,xx]:
=0{回溯,恢复未走标志}
fillchar(a,sizeof(a),0);
dep:
=1;
inputy,x'
readln(y,x);
{x:
y:
if(y>
n)or(x>
m)thenbeginwriteln('
x,yerror!
halt;
a[y,x]:
find(y,x,2);
ifcont=0thenwriteln('
Noanswer!
)elsewrite('
TheEnd!
readln;
【题目】加法分式分解。
如:
1/2=1/4+1/4.找出所有方案。
输入:
NMN为要分解的分数的分母
M为分解成多少项
programfenshifenjie;
constnums=5;
t,m,dep:
n,maxold,max,j:
longint;
path:
array[0..nums]oflongint;
maxok,p:
sum,sum2:
real;
procedureprint;
t:
=t+1;
ifmaxok=truethenbeginmaxold:
=path[m];
maxok:
write('
NO.'
t);
=1tomdowrite('
path[i]:
4);
ifpath[1]=path[m]thenbeginwriteln('
Ok!
t:
procedureinput;
writeln('
inputN:
readln(n);
inputM(M<
nums:
1,'
):
readln(m);
if(n<
=0)or(m<
=0)or(m>
4)or(n>
maxlongint)
thenbeginwriteln('
InvalidInput!
functionsum1(ab:
vara,b,c,d,s1,s2:
ifab=1then
sum1:
=1/path[1]
else
a:
=path[1];
b:
=1;
c:
=path[2];
d:
fori:
=1toab-1do
begin
s2:
=(c*b+a*d);
s1:
=(a*c);
a:
=s1;
b:
=s2;
c:
=path[i+2];
sum1:
=s2/s1;
procedureback;
=dep-1;
ifdep<
=m-2thenmax:
=maxold;
sum:
=sum-1/path[dep];
j:
=path[dep];
procedurefind;
repeat
=dep+1;
=path[dep-1]-1;
p:
=j+1;
if(dep<
>
m)and(j<
=max)then
if(sum+1/j)>
=1/nthenp:
=false
elsebegin
p:
path[dep]:
sum:
=sum+1/path[dep];
end
elseifj>
maxthenback;
ifdep=mthenbegin
sum2:
=sum1(m);
if(sum2)>
1/nthenp:
if(sum2)=1/nthenbeginprint;
max:
back;
end;
if(sum2<
1/n)thenback;
if(j>
=max)thenback;
untilp
untildep=0;
INPUT;
maxok:
fort:
=0tomdopath[t]:
=n;
max:
=maxlongint;
find;
【题目】地图着色问题
【参考程序1】
constlin:
array[1..12,1..12]of0..1{区域相邻数组,1表示相邻}
=((0,1,1,1,1,1,0,0,0,0,0,0),
(1,0,1,0,0,1,1,1,0,0,0,0),
(1,1,0,1,0,0,0,1,1,0,0,0),
(1,0,1,0,1,0,1,0,1,1,0,0),
(1,0,0,1,0,1,0,0,0,1,1,0),
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACM 基础