二、搜索

1.红与黑(codevs2806)

题目网址:http://codevs.cn/problem/2806/

代码:

var

s:array[0..21,0..21] of char;

i,j,sum,w,c,x,y:longint;

procedure m(a,b:longint);

begin

inc(sum);

s[a,b]:=‘#‘;

if(s[a+1,b]=‘.‘) then

begin

m(a+1,b);

end;

if(s[a-1,b]=‘.‘) then

begin

m(a-1,b);

end;

if(s[a,b+1]=‘.‘) then

begin

m(a,b+1);

end;

if(s[a,b-1]=‘.‘) then

begin

m(a,b-1);

end;

end;

begin

readln(w,c);

while (w<>0) and (c<>0) do

begin

fillchar(s,sizeof(s),0);

for i:=1 to c do

begin

for j:=1 to w do

begin

read(s[i,j]);

if (s[i,j]=‘@‘) then

begin

x:=i;

y:=j;

end;

end;

readln;

end;

sum:=0;

m(x,y);

writeln(sum);

readln(w,c);

end;

end.

2.八数码难题

题目网址:http://codevs.cn/problem/1225/

分析:

这题值得说的是康托展开。全排列与整数的映射,挺实用的。

接下来就是普通的BFS了。和用HASH表判重

代码:

type arr=array [1..9] of longint;

var a:array [1..30000] of arr;

fac:array [0..10] of longint;

step,space:array [0..30000] of longint;

i,front,tail:longint;

s:string;

hash:array [1..400000] of boolean;

function cantor(a:arr):longint;

var i,j:longint;

k:arr;

begin

fillchar(k,sizeof(k),0);

cantor:=0;

for i:=1 to 9 do

for j:=i+1 to 9 do

if a[i]>a[j] then inc(k[i]);

for i:=1 to 9 do cantor:=cantor+k[i]*fac[9-i];

cantor:=cantor+1;

end;

procedure exchange(s,t:longint);

var tmp:arr;

num,fun,i:longint;

begin

tmp:=a[front];

fun:=tmp[s]; tmp[s]:=tmp[t];tmp[t]:=fun;

num:=cantor(tmp);

if num=46686 then

begin

write(step[front]+1);

halt;

end;

if not hash[num] then

begin

inc(tail);

a[tail]:=tmp;

hash[num]:=true;

space[tail]:=t;

step[tail]:=step[front]+1;

end;

end;

begin

fillchar(hash,sizeof(hash),false);

readln(s);

fac[0]:=1;

for i:=1 to 9 do fac[i]:=i*fac[i-1];

for i:=1 to 9 do

begin

a[1][i]:=ord(s[i])-ord(‘0‘);

if a[1][i]=0 then space[1]:=i;

end;

hash[cantor(a[1])]:=true;

front:=1;

tail:=1;

step[1]:=0;

while front<=tail do

begin

if space[front]<=6 then exchange(space[front],space[front]+3);

if space[front]>=4 then exchange(space[front],space[front]-3);

if ((space[front]-1)mod 3)>0 then exchange(space[front],space[front]-1);

if ((space[front]-1)mod 3)<2 then exchange(space[front],space[front]+1);

inc(front);

end;

end.

3.武士风度的牛

题目网址:http://codevs.cn/problem/1411/

分析:利用BFS求无权最短路径

代码:

var

a:array[1..150,1..150] of char;

b:array[1..22500,1..3] of longint;

i,j,m,n,x,y,m1,n1,m2,n2,f,r:longint;

begin

readln(n,m);

for i:=1 to m do

begin

for j:=1 to n do

begin

read(a[i,j]);

if a[i,j]=‘K‘ then

begin

m1:=i;

n1:=j;

end;

if a[i,j]=‘H‘ then

begin

m2:=i;

n2:=j;

end;

end;

readln;

end;

f:=1;

r:=1;

a[m2,n2]:=‘*‘;

b[f,1]:=m2;

b[f,2]:=n2;

b[f,3]:=0;

repeat

x:=b[f,1];

y:=b[f,2];

if (x=m1) and (y=n1) then

begin

writeln(b[f,3]);

end;

if (x-1>0) and (y-2>0) and (a[x-1,y-2]<>‘*‘) then

begin

inc(r);

b[r,1]:=x-1;

b[r,2]:=y-2;

b[r,3]:=b[f,3]+1;

a[x-1,y-2]:=‘*‘;

end;

if (x-2>0) and (y-1>0) and (a[x-2,y-1]<>‘*‘) then

begin

inc(r);

b[r,1]:=x-2;

b[r,2]:=y-1;

b[r,3]:=b[f,3]+1;

a[x-2,y-1]:=‘*‘;

end;

if (x-2>0) and (y+1<n) and (a[x-2,y+1]<>‘*‘) then

begin

inc(r);

b[r,1]:=x-2;

b[r,2]:=y+1;

b[r,3]:=b[f,3]+1;

a[x-2,y+1]:=‘*‘;

end;

if (x-1>0) and (y+2<n) and (a[x-1,y+2]<>‘*‘) then

begin

inc(r);

b[r,1]:=x-1;

b[r,2]:=y+2;

b[r,3]:=b[f,3]+1;

a[x-1,y+2]:=‘*‘;

end;

if (x+1<m) and (y-2>0) and (a[x+1,y-2]<>‘*‘) then

begin

inc(r);

b[r,1]:=x+1;

b[r,2]:=y-2;

b[r,3]:=b[f,3]+1;

a[x+1,y-2]:=‘*‘;

end;

if (x+2<m) and (y+1<n) and (a[x+2,y+1]<>‘*‘) then

begin

inc(r);

b[r,1]:=x+2;

b[r,2]:=y+1;

b[r,3]:=b[f,3]+1;

a[x+2,y+1]:=‘*‘;

end;

if (x+2<m) and (y-1>0) and (a[x+2,y-1]<>‘*‘) then

begin

inc(r);

b[r,1]:=x+2;

b[r,2]:=y-1;

b[r,3]:=b[f,3]+1;

a[x+2,y-1]:=‘*‘;

end;

if (x+1<m) and (y+2<n) and (a[x+1,y+2]<>‘*‘) then

begin

inc(r);

b[r,1]:=x+1;

b[r,2]:=y+2;

b[r,3]:=b[f,3]+1;

a[x+1,y+2]:=‘*‘;

end;

inc(f);

until f>r;

end.

4.最大黑区域

描写叙述:

二值图像是由黑白两种像素组成的矩形点阵,图像识别的一个操作是求出图像中最大黑区域的面积。请设计一个程序完毕二值图像的这个操作。黑区域由黑像素组成。一个黑区域中的每一个像素至少与该区域中的还有一个像素相邻,规定一个像素仅与其上、下、左、右的像素相邻。两个不同的黑区域没有相邻的像素。

一个黑区域的面积是其所包括的像素的个数。

输入格式:

输入由多个測试例组成。

每一个測试例的第一行含两个整数n和m, (1 <=n,m<=100), 分别表示二值图像的行数与列数,后面紧跟着n行,每行含m个整数0或1,当中第i行表示图像的第i行的m个像素,0表示白像素,1表示黑像素。

同一行的相邻两个整数之间用一个空格隔开,两个測试例之间用一个空行隔开,最后一个測试例之后隔一个空行,再接的一行含有两个整数0,标志输入的结束。

输出格式:

每一个測试例相应一行输出,含一个整数,表示相应的图像中最大黑区域的面积。

输入例子:

5 6

0 1 1 0 0 1

1 1 0 1 0 1

0 1 0 0 1 0

0 0 0 1 1 1

1 0 1 1 1 0

0 0

输出例子:

7

分析:利用BFS求连通块

代码:

var

a:array [1..101,1..101] of 0..1;

f:array [1..101,1..101] of boolean;

i,j,n,m,x,m1,n1,max:longint;

ch:string;

procedure js(m1,n1:longint);

begin

if (m1>m) or (n1>n) then exit;

a[m1,n1]:=0;

if (m1>1)and(a[m1-1,n1]<>0) then

begin

js(m1-1,n1);

end;

if (n1>1)and(a[m1,n1-1]<>0) then

begin

js(m1,n1-1);

end;

if (a[m1,n1+1]<>0) then

begin

js(m1,n1+1);

end;

if (a[m1+1,n1]<>0) then

begin

js(m1+1,n1);

end;

inc(x);

exit;

end;

begin

max:=0;

x:=0;

readln(m,n);

for i:=1 to m do

begin

for j:=1 to n do

begin

read(a[i,j]);

end;

readln;

end;

for i:=1 to m do

begin

for j:=1 to n do

begin

if a[i,j]<>0 then js(i,j);

if max<x then max:=x;

x:=0;

end;

end;

writeln(max);

end.

5.解救ice-cream

描写叙述 Description

给你一张坐标图,s为Tina的初始位置。m为Ice-cream home的位置。‘.’为路面,Tina在上面,每单位时间能够移动一格;‘#’为草地,Tina在上面,每两单位时间能够移动一格(建议不要模仿—毕竟Tina还小);‘o’是障碍物,Tina不能在它上面行动。也就是说,Tina仅仅能在路面或草地上行走,必须绕过障碍物。并到达冰淇淋店。但是…………不保证到达时,冰淇淋还未融化,所以……就请聪明的你……选择最佳的方案啦…………假设。Tina到的时候,冰淇淋已经融化完了,那她但是会哭的。

输入格式 Input Format

依次输入冰淇淋的融化时间t(0<t<1000),坐标图的长x,宽y(5<=x,y<=25){太长打起来好累……},和整张坐标图。

输出格式 Output Format

推断依照最优方案能否够赶在冰淇淋融化之前到达冰淇淋店(注:当T=最优方案所用时间,则推断为未赶到),如赶到,输出所用时间;如未赶到。输出Tina的哭声——“55555”(不包含引號)。

例子输入 Sample Input

11

10

8

......s...

..........

#ooooooo.o

#.........

#.........

#.........

#.....m...

#.........

例子输出 Sample Output

10

时间限制 Time Limitation

各个測试点1s

分析:利用BFS求加权单源最佳路径

借用王大牛代码:

program P1340;

type

rec=record

x,y:longint;

di:longint;

time:longint;

end;

var

s:array[1..100000,1..4] of longint;

time:array[1..30,1..30] of longint;

a:array[1..30,1..30] of char;

sb1,sb2:char;

b:array[1..30,1..30] of longint;

q,open,closed,t,x,y,x0,y0,x1,y1,i,j,k,l,m:longint;

begin

q:=maxlongint;

assign(input,‘haha.in‘);

reset(input);

readln(t);

read(x,y);

for j:=1 to y do

begin

read(sb1,sb2);

for i:=1 to x do

begin

read(a[i,j]);

if a[i,j]=‘.‘then b[i,j]:=1

else if a[i,j]=‘#‘then b[i,j]:=2

else if a[i,j]=‘o‘ then b[i,j]:=maxlongint

else if a[i,j]=‘s‘ then begin x0:=i;y0:=j; b[i,j]:=1;end

else if a[i,j]=‘m‘ then begin x1:=i;y1:=j; b[i,j]:=0;end;

end;

end;

close(input);

for j:=1 to y do

for i:=1 to x do

time[i,j]:=maxlongint;

closed:=0; open:=1;

s[1,1]:=x0; s[1,2]:=y0; s[1,3]:=0; s[1,4]:=0;

repeat

repeat

inc(closed);

if time[s[closed,1],s[closed,2]]>s[closed,4] then begin

time[s[closed,1],s[closed,2]]:=s[closed,4];

if (s[closed,3]<>1)and(s[closed,1]<x)and(a[s[closed,1]+1,s[closed,2]]<>‘o‘)then begin

inc(open);

s[open,1]:=s[closed,1]+1;

s[open,2]:=s[closed,2];

s[open,3]:=3;

s[open,4]:=s[closed,4]+b[s[closed,1],s[closed,2]];

end;

if a[s[open,1],s[open,2]]=‘m‘ then break;

if (s[closed,3]<>3)and(s[closed,1]>1)and(a[s[closed,1]-1,s[closed,2]]<>‘o‘) then begin

inc(open);

s[open,1]:=s[closed,1]-1;

s[open,2]:=s[closed,2];

s[open,3]:=1;

s[open,4]:=s[closed,4]+b[s[closed,1],s[closed,2]];

end;

if a[s[open,1],s[open,2]]=‘m‘ then break;

if (s[closed,3]<>0)and(s[closed,2]>1)and(a[s[closed,1],s[closed,2]-1]<>‘o‘) then begin

inc(open);

s[open,1]:=s[closed,1];

s[open,2]:=s[closed,2]-1;

s[open,3]:=2;

s[open,4]:=s[closed,4]+b[s[closed,1],s[closed,2]];

end;

if a[s[open,1],s[open,2]]=‘m‘ then break;

if (s[closed,3]<>2)and(s[closed,2]<y)and(a[s[closed,1],s[closed,2]+1]<>‘o‘) then begin

inc(open);

s[open,1]:=s[closed,1];

s[open,2]:=s[closed,2]+1;

s[open,3]:=0;

s[open,4]:=s[closed,4]+b[s[closed,1],s[closed,2]];

end;

if a[s[open,1],s[open,2]]=‘m‘ then break;

end;

until (a[s[open,1],s[open,2]]=‘m‘)or(closed=open);

if q>s[open,4] then q:=s[open,4];

until (closed=open);

if q>=t then write(‘55555‘)

else

write(q);

end.

时间: 2024-12-28 00:24:18

二、搜索的相关文章

Lucene教程(二) 搜索初步

搜索可分为如下几步: 创建Directory 创建IndexReader 根据IndexReader创建IndexSearch 创建搜索的Query 根据searcher搜索并且返回TopDocs 根据TopDocs获取ScoreDoc对象 根据searcher和ScoreDoc对象获取具体的Document对象 根据Document对象获取需要的值 下面是例子代码: 3.5版本: 3.5版本比较简单,只需要Lucene核心包lucene-core即可,pom文件如下所示: <project x

Elasticsearch学习之深入搜索二 --- 搜索底层原理剖析

1. 普通match如何转换为term+should { "match": { "title": "java elasticsearch"}} 使用诸如上面的match query进行多值搜索的时候,es会在底层自动将这个match query转换为bool的语法,bool should,指定多个搜索词,同时使用term query { "bool": { "should": [ { "term&

kuangbin专题 专题二 搜索进阶 Nightmare Ⅱ HDU - 3085

题目链接:https://vjudge.net/problem/HDU-3085 题意:有两个鬼和两个人和墙,鬼先走,人再走,鬼每走过的地方都会复制一个新鬼, 但新鬼只能等待旧鬼走完一次行程之后,下一次旧鬼再次开始新的行程时旧鬼才能移动, 旧鬼一个行程能走最多两步,M能走三步,G能走一步. 问M和G能不能在被鬼抓住之前相遇,求最短时间. ‘Z’表示鬼. 第一次用曼哈顿距离来真正解决搜索,参考过别人的代码,这份代码感觉还是比较清楚和简单的. 人每次移动一个距离都要进行一次曼哈顿距离的判断,判断人到

学习MVC之租房网站(九)-房源显示和搜索

在上一篇<学习MVC之租房网站(八)- 前台注册和登录>完成了前台用户的注册.登录.重置密码等功能,然后要实现与业务相关的功能,包括房源的显示.检索等. 一 房源显示 房源显示内容较多,涉及到的有House.Attachment.HousePic,处理的信息包括房屋类型.朝向.楼层.装修状态.家具等. 这里显示的房源是通过后台的房源管理维护的,后台添加房源时会上传图片.使用UEditor编辑文本,前台显示房源时也要把图片和富文本显示出来.在前台使用后台上传的图片是个问题:UEditor产生的富

1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门

 一: 1  搜索引擎的历史 萌芽:Archie.Gopher Archie:搜索FTP服务器上的文件 Gopher:索引网页 2  起步:Robot(网络机器人)的出现与spider(网络爬虫) Robot基于网络的,可以执行特定任务的程序 Spider:特殊的机器人,网络爬虫,爬取互联网上的信息(可以是文件,网络)----网络自动下载程序 3   发展阶段:excite,galaxy,yahoo这些公司做搜索 4   繁荣:infoseek,AltaVista,Google和百度 5  

【题解】SOFTWARE 二分+搜索/dp

题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是相同的,并且是已知的,但完成不同软件的一个模块的时间是不同的,每个技术人员在同一时刻只能做一个模块,一个模块只能由一个人独立完成而不能由多人协同完成.一个技术人员在整个开发期内完成一个模块以后可以接着做任一软件的任一模块.写一个程序,求出公司最早能在什么时候交付软件. 输入输出格式 输入格式: 输入

剑指offer 24:二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 后序遍历,顾名思义根节点位于尾部,故可将一个序列分为左子树序列.右子树序列和根节点,对于两个子序列又可分别验证是否是二搜索叉树的后序序列,即此问题是一个递归问题.递归的出口是系列中仅包含一个元素. C++代码实现 class Solution { public: bool VerifySquenceOfBST(vector<int> s

CSP2019突击训练(搜索专题)

专题一 简单搜索POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find The MultiplePOJ 3126 Prime PathPOJ 3087 Shuffle'm UpPOJ 3414 PotsFZU 2150 Fire GameUVA 11624 Fire!POJ 3984 迷宫问题HDU 1241 Oil DepositsHDU 1495 非常可乐HDU 261

信息安全系统设计基础第八周总结

Linux基本概念 命令行操作 [Tab] 使用Tab键来进行命令补全 [Ctrl+c] 立即停止并恢复到可控状态,可以使用Ctrl+c键来强行终止当前程序(并不会使终端退出) 用户及文件管理权限 一.Linux用户管理 由于 Linux 的 用户管理 和 权限机制 ,不同用户不可以轻易地查看.修改彼此的文件. who 命令其它常用参数 (3)用户组 方式1.使用groups命令 方式2.查看/etc/group文件 /etc/group文件格式说明: /etc/group 的内容包括用户组(G

acm课程总结报告

本学期的选修课ACM程序设计进入尾声,首先要总结的当然是感谢老师这类的客套话,良心话是真的谢谢费老耐心认真的教学,确实学到了很多东西,这一点从数据结构这门课的学习中容易看出,轻松很多. 本学期总共学习里四个专题:第一讲贪心算法,第二讲搜索,第三讲动态规划以及现在正在 努力做的图.下面我将以这四个专题为基础分别讲解ACM中所获得知识内容,感悟. 专题一贪心算法. 贪心算法包括计算活动安排的贪心算法,背包问题,删数问题.他的理论基础有三点,1,在问题的每一步选择中都采取在当前状态下最好或者最优的选择