ACM经典算法(3)

2019-01-19 12:34

i:=k-2;

while i>0 do begin

if (a[i,1]=a[k,1]) and(a[i,2]=a[k,2]) then exit; i:=i-2; end; can:=true; end;

procedure step(k,p:integer); var

i:integer; begin

if a[k,1]+a[k,2]=0 then begin print(k);exit;end; for i:=1 to 5 do begin

a[k+1,1]:=a[k,1]+p*c[i,1]; a[k+1,2]:=a[k,2]+p*c[i,2]; if can(k+1) then step(k+1,-p); end; end; begin

a[1,1]:=3; a[1,2]:=3; step(1,-1); end.

第五次课深搜2

1、n2的棋盘,填1~n2个数,要求下比上大,左比右大。程序如下: var

a:array[0..11,0..11]of integer; b:array[0..200]of boolean; n,s:integer; procedure print; var

i,j:integer; begin

for i:=1 to n do begin for j:=1 to n do write(a[i,j]:3); writeln; end;

writeln('--------------');

readln; end;

procedure try(x,y:integer); var

i,j:integer; begin

if (x=n+1) then begin inc(s);print;exit;end; if y=n+1 then try(x+1,1)else begin j:=0;

if (y>=1)and(a[x,y-1]>j) then j:=a[x,y-1]; if (x>=1)and(j

a[x,y]:=i; b[i]:=false; try(x,y+1);b[i]:=true; end; end; end; begin

readln(n);

fillchar(b,sizeof(b),true); s:=0; try(1,1); writeln(s); end.

2、n*n方阵中填*号,使得每行每列都有m个*(m<=n)共n*m个*。

(角度:共n*m个*,则考虑*放到哪个格子里,a[x,y]表示在x行里*的位置,y表示*的个数。)

程序如下: var

a:array[1..10,0..10]of integer; b:array[1..10]of integer; n,m,s:integer; procedure print; var

x,y,k:integer; begin

for x:=1 to n do begin k:=1;

for y:=1 to n do

if a[x,k]=y then begin write('*':2);k:=k+1;end else write('+':2); writeln; end; writeln; end;

procedure try(x,y:integer); var i:integer; begin

if x>n then begin print;inc(s);exit;end; if y>m then try(x+1,1) else

for i:=a[x,y-1]+1 to n-m+y do begin

a[x,y]:=i;b[i]:=b[i]+1;

if (b[i]<=m)and(b[i]>=m-(n-x)) then try(x,y+1); b[i]:=b[i]-1; end; end; begin

readln(n,m); s:=0;

fillchar(b,sizeof(b),0); fillchar(a,sizeof(a),0); try(1,1); writeln(s); end.

3、中国盒”abababab__” ->”aaaa__bbbb”;

程序如下: var

a:array[1..1000]of string[10]; i,j:integer;

procedure print(k:integer); var

i:integer; begin

for i:=1 to k do writeln(a[i]); end;

function nrep(k:integer):boolean; var

i:integer; begin

nrep:=false;

for i:=1 to k-1 do if a[i]=a[k] then exit; nrep:=true; end;

procedure try(k:integer); var

i:integer; begin

if a[k-1]='aaaa__bbbb'then begin print(k-1);exit;end; for i:=1 to 9 do

if a[k-1,i]='_' then break; for j:=1 to 9 do

if (j+1i+1) then begin a[k]:=a[k-1]; a[k,i]:=a[k-1,j];

a[k,i+1]:=a[k-1,j+1]; a[k,j]:='_'; a[k,j+1]:='_';

if nrep(k) then try(k+1); end; end; begin

a[1]:='abababab__'; try(2); end.

第六次课深搜(3)

搜索:问题的表示、状态(初始状态----目标状态)、变化的规则。 判合法、判重复、判结果

最优解的求法:用一个变量去存放最优解,每次去比,搜一遍,挑一个最优的。 角度:哪个角度的工作量最少,就从哪个角度去搜即搜的次数最少。 次序:选择哪个次序,把最好的放在前面,把不好的放在后边。

深度:深度为m,宽度为n,则搜索的次数为nm,所以尽量减少深度,把一些不可能的深度让其退出,就是优化。 宽度:把无效的给滤掉。 展望:求最优解时适用。先把最优解给存起来,如果一个值明显比最优解不好,则让他退出,就是优化。

1、 任务的最佳安排。

源程序名

arrange.???(pas|c|cpp)

输入文件名 arrange.in 输出文件名 arrange.out 时间限制 1s/testcase 空间限制 32MB

- 问题描述

给省队选拔赛命题的时候,周老师手下有N个命题人,要命N种不同类型的试题,其中每人命每一类型的试题一题。因为每个命题人对不同题型的掌握程度不同,所以他们编出的试题难度也有不同(这用一个难度数值来表示)。为了尽可能地刁难大家,周老师决定出一张N个题的试卷,每一类型的试题一题,而且所有题的难度值总和最大。

- 输入数据

第一行为N(N <= 20),代表命题人的个数。(40%的数据N<=10) 以后N行,每行N个整数(每个数不超过100),第i行j列的数表示第i个人出的第j种题目的难度大小。

- 输出数据

一行,表示试卷难度的最大值。

- 样例输入 3

50 50 1


ACM经典算法(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:全市保障性安居工程实施情况专项督查方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: