搜索算法个人总结pascalWord文档格式.docx
- 文档编号:19365627
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:34
- 大小:88.37KB
搜索算法个人总结pascalWord文档格式.docx
《搜索算法个人总结pascalWord文档格式.docx》由会员分享,可在线阅读,更多相关《搜索算法个人总结pascalWord文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
proceduredfs(dep,row,l,r:
//dep:
层数row:
pos,p,i:
ifdep>
nthen//决策有效
inc(sum);
ifsum<
=3then
fori:
=1tondo
write(a[i],'
'
);
//输出决策
writeln;
end;
elsebegin
=1tondo//第i位是否可以放皇后
=(1shl(i-1));
//二进制决策
=pand(roworlorr);
//pos记录冲突
if(pos=0)//没有冲突
thenbegin
a[dep]:
=i;
//记录决策
dfs(dep+1,row+p,(l+p)shl1,(r+p)shr1);
//下一层递归
a[1]:
//初始化第一行,有n个状态
t:
=1shl(i-1);
dfs(2,t,tshl1,tshr1);
end.
2.计算细胞数
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
如:
阵列
0234500067
1034560500
2045600671
0000000089
有4个细胞
输入格式InputFormat
第一行 :
两个数字MN(1<
=M<
=501<
=N<
80)表示该阵列有M行N列
从第2行到第M+1行 每行有连续的N个字符
输出格式OutputFormat
一行:
细胞个数
似乎我写出来的不是标准的搜索……
//思路:
以细胞中的一个点为起点,将他及他周围的不为0的点都改为0,然后找下一个。
//提交情况:
一次AC
programtyvj1127;
n,m,re:
array[1..100,1..100]oflongint;
procedureinit;
assign(input,'
tyvj1127.in'
);
assign(output,'
tyvj1127.out'
reset(input);
rewrite(output);
procedurechange(i,j:
k,l:
a[i,j]:
=0;
ifi>
1thenifa[i-1,j]>
0thenchange(i-1,j);
ifa[i+1,j]>
0thenchange(i+1,j);
ifj>
1thenifa[i,j-1]>
0thenchange(i,j-1);
ifa[i,j+1]>
0thenchange(i,j+1);
procedureprepare;
i,j:
char;
readln(n,m);
forj:
=1tomdo
read(k);
val(k,a[i,j]);
readln;
re:
ifa[i,j]<
0thenbeginchange(i,j);
=re+1;
writeln(re);
procedureoutit;
close(input);
close(output);
init;
prepare;
outit;
3·
滑雪
trs喜欢滑雪。
他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。
为了得到更快的速度,滑行的路线必须向下倾斜。
例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。
例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
输入文件
第1行:
两个数字r,c(1<
=r,c<
=100),表示矩阵的行列。
第2..r+1行:
每行c个数,表示这个矩阵。
输出文件
仅一行:
输出1个整数,表示可以滑行的最大长度。
样例输入SampleInput
55
12345
161718196
152425207
142322218
131211109
样例输出SampleOutput
25
记忆化搜索,也没设么好说的,就是刚开始的时候写出来总是无法跳出递归……
提交情况:
1次WA 原因:
没删input和output
programski;
const
maxn=100;
dx:
array[1..4]oflongint=(0,-1,0,1);
dy:
array[1..4]oflongint=(1,0,-1,0);
a,f:
array[1..maxn,1..maxn]oflongint;
max,r,c,i,j:
functionbest(x,y:
longint):
i,x2,y2:
iff[x,y]>
0thenexit(f[x,y]);
best:
=1;
fori:
=1to4do
x2:
=x+dx[i];
y2:
=y+dy[i];
if(x2<
=r)and(x2>
=1)and(y2<
=c)and(y2>
=1)and(a[x,y]>
a[x2,y2])then
ifbest(x2,y2)+1>
bestthen
best:
=best(x2,y2)+1;
f[x,y]:
=best;
readln(r,c);
=1tordo
=1tocdoread(a[i,j]);
fillchar(f,sizeof(f),0);
max:
=1tocdobegin
ifbest(i,j)>
maxthenmax:
=best(i,j);
writeln(max);
end.
**4·
Sramoc问题(SramocProblem)
源程序名sramoc.?
?
(pas,c,cpp)
可执行文件名sramoc.exe
输入文件名sramoc.in
输出文件名sramoc.out
问题描述:
Sramoc(K,M)表示用数字0、1、2…、K-1组成的自然数中能被M整除的最小数。
给定K、M,求Sramoc(K,M)。
例如K=2,M=7的时候,Sramoc(2,7)=1001。
输入格式:
从文件SRAMOC.DAT读入数据。
第一行为两个整数K、M满足2<
=K<
=10、1<
=M<
=1000。
输出格式:
输出Sramoc(K,M)到SRAMOC.OUT。
样例
SRAMOC.DAT
SRAMOC.OUT
27
1001
思路:
广搜,从1位数的余数出发,不停扩展,生成新余数,直到余数0第一次出现
提交情况:
一次90分 原因直接扩展有一组的答案超出了qword的最大值……
改进思路,每次只记录一位。
90分程序如下:
programsramoc;
k,m:
d:
array[0..100000]ofqword;
hash:
array[0..2000]oflongint;
sramoc.in'
sramoc.out'
readln(k,m);
halt;
proceduremain;
l,r,i,j:
x,y:
qword;
l:
r:
fillchar(hash,sizeof(hash),0);
=1tok-1do
d[i]:
ifd[i]modm=0thenbeginwriteln(d[i]);
outit;
r:
=r+1;
hash[d[i]modm]:
repeat
=l+1;
x:
=d[l];
=0tok-1do
y:
=x*10+i;
ifymodm=0thenbeginwriteln(y);
ifhash[ymodm]=0thenbegin
d[r]:
=y;
hash[ymodm]:
untill=r;
init;
main;
**5·
黑白棋游戏
源程序名game.?
可执行文件名game.exe
输入文件名game.in
输出文件名game.out
【问题描述】
黑白棋游戏的棋盘由4×
4方格阵列构成。
棋盘的每一方格中放有1枚棋子,共有8枚白棋子和8枚黑棋子。
这16枚棋子的每一种放置方案都构成一个游戏状态。
在棋盘上拥有1条公共边的2个方格称为相邻方格。
一个方格最多可有4个相邻方格。
在玩黑白棋游戏时,每一步可将任何2个相邻方格中棋子互换位置。
对于给定的初始游戏状态和目标游戏状态,编程计算从初始游戏状态变化到目标游戏状态的最短着棋序列。
【输入】
输入文件共有8行。
前四行是初始游戏状态,后四行是目标游戏状态。
每行4个数分别表示该行放置的棋子颜色。
“0”表示白棋;
“1”表示黑棋。
【输出】
输出文件的第一行是着棋步数n。
接下来n行,每行4个数分别表示该步交换棋子的两个相邻方格的位置。
例如,abcd表示将棋盘上(a,b)处的棋子与(c,d)处的棋子换位。
【样例】
game.ingame.out
11114
00001222
11101424
00103242
10104344
0101
1010
广搜,用位运算记录及更改状态,分别处理上下交换和左右交换.
提交情况:
4次——60分前3次提交分别是输出格式不对,第4,8,12位没有单独处理
60分的程序如下(4组方案不对):
programgame;
type
mm=record
num,st,c1,c2,cn:
array[1..16,1..2]oflongint=((4,4),(4,3),(4,2),(4,1),(3,4),(3,3),(3,2),(3,1),(2,4),(2,3),(2,2),(2,1),(1,4),(1,3),(1,2),(1,1));
ss,tt:
array[0..4,0..4]oflongint;
array[0..1000000]ofmm;
s,t:
game.in'
game.out'
i,j,k,w:
s1,c:
string;
s:
=1to4do
readln(s1);
c:
=s1[j];
val(c,ss[i,j]);
=17-((i-1)*4+j);
=s+(ss[i,j]shl(k-1));
val(c,tt[i,j]);
=t+(tt[i,j]shl(k-1));
procedureprint(x:
i,last,j,k:
ifx=1thenexit;
last:
=d[x].st;
j:
=d[x].c2;
=d[x].c1;
write(p[j,1],p[j,2]);
writeln(p[k,1],p[k,2]);
print(last);
i,j,l,r,x,y:
array[0..100000]ofboolean;
fillchar(hash,sizeof(hash),false);
hash[s]:
=true;
d[1].num:
=s;
d[1].cn:
repeat
=d[l].num;
=1to15do
if(((xshr(i-1))and1)<
((xshr(i))and1))and(i<
4)and(i<
8)and(i<
12)
=xxor(1shl(i-1));
=yxor(1shl(i));
ifhash[y]=falsethen
d[r].num:
d[r].st:
=l;
d[r].c1:
d[r].c2:
=i+1;
d[r].cn:
=d[l].cn+1;
hash[y]:
ify=tthenbeginwriteln(d[r].cn);
print(r);
if(i<
=12)and(((xshr(i-1))and1)<
((xshr(i+4-1))and1))
=yxor(1shl(i+3));
=i+4;
print(r);
untill>
=r;
6·
迷宫(maze.pas/c/cpp)
电脑游戏中有许多令人头疼的迷宫,会花费玩家相当多的时间,你通过秘笈获得了游戏迷宫的地图,你希望找到最短的一条走出迷宫的道路,并且想知道一共有多少条最短的道路,但是由于地图非常庞大,所以你不能在短时间找出这些道路,因此,你需要编写一个程序来找出这些最短的道路,并且统计一下一共有多少条这样的道路。
例如,对于下图所示的迷宫:
S
X
E
X表示障碍物,不可以通过,S表示迷宫的入口,E表示迷宫的出口。
显然,从入口到出口至少需要走6步,而长度为6的道路一共有两条。
输入文件maze.in,第一行是一个整数n(1≤n≤25),表示迷宫是一个n×
n的矩阵。
以下n行每行有n个字符来描述地图,“.”表示可以通过,“X”表示不可以通过,“S”表示迷宫的入口,“E”表示迷宫的出口。
(注意:
所有的字母均为大写)。
输出文件maze.out包括两行,第一行包含一个整数,表示从入口到出口走的最短距离。
第二行包含一个整数,表示最短路径的调数,答案保证小于231。
【样例输入】
4
…S
.XX.
E...
【样例输出】
6
2
写两个广搜先找距离再找条数(此程序用动规的思想,写的类似广搜)
一次ac
programmaze;
map:
array[0..50,0..50]ofchar;
a,b:
array[0..850,0..50]oflongint;
n,sx,sy,ex,ey:
maze.in'
maze.out'
read(map[i,j]);
ifmap[i,j]='
S'
thenbeginsx:
sy:
=j;
E'
thenbeginex:
ey:
procedurechang;
i,j,f,t:
dui:
array[1..2000,1..2]oflongint;
=-1;
f:
a[sx,sy]:
dui[1,1]:
=sx;
dui[1,2]:
=sy;
=f+1;
i:
=dui[f,1];
=dui[f,2];
if(a[i-1,j]<
0)and(map[i-1,j]<
'
X'
)
=t+1;
a[i-1,j]:
=a[i,j]+1;
dui[t,1]:
=i-1;
dui[t,2]:
if(a[i+1,j]<
0)and(map[i+1,j]<
a[i+1,j]:
if(a[i,j-1]<
0)and(map[i,j-1]<
a[i,j-1]:
=j-1;
if(a[i,j+1]<
0)and(map[i,j+1]<
a[i,j+1]:
=j+1;
ifa[ex,ey]>
0thenexit;
untilf>
=t;
procedurelujin;
array[0..50,0..50]ofboolean;
be
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 搜索 算法 个人 总结 pascal