搜索基础题

1.http://acm.hdu.edu.cn/showproblem.php?pid=1312

题意:在一个仅有红黑格子组成的矩形中,一个人只能走上下左右相邻黑色格子,问从起点开始共能走多少个格子?

’#‘:红色格子

’.‘: 黑色格子;

’@‘:起点 

BFS 和 DFS 都可以遍历所有走的点,每次走过一点时,计数++即可;

2.http://acm.hdu.edu.cn/showproblem.php?pid=1728

由题可知,在限制转弯数量的前提下 能够从一点走到另一个点即可;BFS 和 DFS都能求出解。我 DFS 还没实现

需要注意:1.点坐标是从 1 开始的。

     2.最短的路径可能不满足转弯数的限制。

     3.起点与终点重合。

超内存代码:还没找到原因。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 using namespace std;
 5 #define N 105
 6
 7 struct Pos
 8 {
 9     int x, y;
10     int turn;
11     int dire;
12 }S, E;
13 char map[N][N];
14 bool used[N][N][12][4];
15 int dir[][2]={1,0, -1,0, 0,1, 0,-1};
16 int n, m, k;
17
18 bool Judge (Pos s)
19 {
20     if (s.x>=1 && s.x<=m && s.y>=1 && s.y<=n && map[s.x][s.y]==‘.‘ && !used[s.x][s.y][S.turn][S.dire] && s.turn <= k)
21         return true;
22     return false;
23 }
24
25 bool  bfs ()
26 {
27     Pos Pre, Cur;
28     queue <Pos> Q;
29     while (!Q.empty ()) Q.pop();
30     memset (used, 0, sizeof used);
31
32     S.dire = -1;
33     S.turn = 0;
34     used[S.x][S.y][S.turn][S.dire] = true;
35     Q.push (S);
36     while (!Q.empty ())
37     {
38         Pre = Q.front ();
39         Cur = Pre;
40         Q.pop();
41         if (Cur.x==E.x && Cur.y==E.y)
42             return true;
43         for(int i=0; i<4; i++)
44         {
45             Cur.x = Pre.x + dir[i][0];
46             Cur.y = Pre.y + dir[i][1];
47             Cur.turn = Pre.turn;
48             Cur.dire = i;
49             if (Cur.dire != Pre.dire && Pre.dire !=-1)
50                 Cur.turn++;
51             if (Judge (Cur))
52             {
53                 used[Cur.x][Cur.y][Cur.turn][Cur.dire] = true;
54                 Q.push (Cur);
55             }
56         }
57     }
58     return false;
59 }
60
61 int main ()
62 {
63     int t;
64 //    freopen ("test.txt","r",stdin);
65     scanf ("%d",&t);
66     while (t--)
67     {
68         scanf ("%d%d",&m, &n);
69         for (int i=1; i<=m; i++)
70             for (int j=1; j<=n; j++)
71                 scanf (" %c", map[i]+j);
72         scanf ("%d%d%d%d%d",&k, &S.y, &S.x, &E.y, &E.x);
73
74         puts ((bfs ()?"yes":"no"));
75     }
76     return 0;
77 }

1.http://acm.hdu.edu.cn/showproblem.php?pid=1010;

题意:在一个矩形的迷宫里面, 问是否可以恰好在 给定的时间点 走到出口。

‘X‘:墙壁;

’S‘:起点;

‘D‘:出口;

’.‘: 空地。

这道题,是问你是否有解,不是要求最优解,所以可以用DFS深度搜索,  奇偶性剪枝+路径剪枝优化时间防TLE。如果硬是要用BFS按理来说应该是可以求出结果的,不过我BFS一直WA,一直想不通。留着以后进步了再斟酌。

DFS代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 using namespace std;
 5
 6 int n, m, t, ex, ey;
 7 char map[10][10];
 8 bool visit[10][10], flag;
 9 int dir[][2]={1,0, -1,0, 0,1, 0,-1};
10
11 void dfs (int x, int y, int cnt)
12 {
13     if (x<0 || x>n-1 || y<0 || y>m-1) return;
14     if (flag || cnt > t) return;
15     if (x==ex && y==ey)
16     {
17         if (cnt == t)
18             flag = true;
19         return;
20     }
21     for (int i=0; i<4; i++)
22     {
23         int xx = x + dir[i][0];
24         int yy = y + dir[i][1];
25         if (map[xx][yy]==‘X‘ || visit[xx][yy]) continue;
26         visit[xx][yy] = true;
27         dfs (xx, yy, cnt+1);
28         if (flag) return;
29         visit[xx][yy] = false;
30     }
31 }
32 int main ()
33 {
34 //    freopen ("test.txt","r",stdin);
35     while (~scanf ("%d%d%d",&n, &m, &t) && n+m+t)
36     {
37         int wall=0, sx, sy;
38         for (int i=0; i<n; i++)
39             for (int j=0; j<m; j++)
40             {
41                 scanf (" %c",map[i]+j);
42                 if (map[i][j] == ‘S‘)
43                 {
44                     sx = i; sy = j;
45                 }
46                 else if (map[i][j]==‘D‘)
47                 {
48                     ex = i; ey = j;
49                 }
50                 else if (map[i][j]==‘X‘)
51                     wall++;
52             }
53         //路径剪枝
54         if (n*m-wall < t)
55         {
56             puts ("NO");
57             continue;
58         }
59         //奇偶性剪枝
60         int tmp = fabs (sx-ex) + fabs (sy-ey);
61         if ((t - tmp) & 1)
62         {
63             puts ("NO");
64             continue;
65         }
66         memset (visit, 0, sizeof visit);
67         flag = false;
68         visit[sx][sy] = true;
69         dfs(sx, sy, 0);
70         puts ((flag?"YES":"NO"));
71     }
72     return 0;
73 }

时间: 2024-10-29 19:13:00

搜索基础题的相关文章

一些DP基础题(1)

HDU 1024  Max Sum Plus Plus Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem. Given a consecutive num

面试题收集-java面试题及答案(基础题122道,代码题19道)

JAVA相关基础知识1.面向对象的特征有哪些方面?1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象.2.继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类).派

python每日经典算法题5(基础题)+1(中难题)

现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级函数的应用.这些题目是在某些刷题的网站上登记的有水平的题目.这里如果有需要input的简单题,就略去了输出结果.如果时间充裕,则就会增加每日更多习题. 一:基础算法题10道 1.判断用户输入的年份是否为闰年 题目解析: (1)问题分析:能被4整除但不能被100整除的年份为普通闰年,能被400整除的年

1、基础题

基础题: 1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.session与cookie的区别? 答:session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放 cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的. 两者都可通过时间来设置时间长短 3.数据

【HDU1232】畅通工程(并查集基础题)

裸敲并查集,很水一次AC 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 #include <string> 1

linux 基础题整理

基础题: 1.查看系统内核版本号及系统名称 2.查看smb服务所用的端口号 3.禁ping 4.查出22端口现在运行什么程序 5.登录提示符前的输出信息"you are welcome!!!" 6.成功登录后自动输出信息"距离全国比赛还剩1天!!!" 7.确认安全终端为tty1 8.取消普通用户的控制台访问的三个权限:reboot.halt.shutdown 9.只允许组ID为10的成员通过su命令改变为root用户 10.禁止Control-Alt-Delete键

【坑】这些天刷基础题犯的诡异错误大集合

这些天刷基础题犯的诡(sha)异(bi)错误大集合 by pkl ———其中可能会有部分资料引用,引用会表明链接,如果没有标明敬请指出QAQ抱歉QAQ---------------------------------- 首先安利一发帖子:OI中有哪些常数优化的小技巧 ps:注意是基础题.所以嘛错误nc需要原谅..毕竟我也是蒟蒻QAQAQ大蒟蒻QAQ · 循环里的临时变量出了循环便无效· 递归的临时变量不要定成全局变量· 赋值的对象不要一不小心手抖写反了…比如b = a写成a = b[估计也只有我

nyist oj 36 最长公共子序列 (动态规划基础题)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接

【HDU1102】Constructing Roads(MST基础题)

最小生成树水题.prim一次AC 1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 10 #define typec int