搜索算法3之1005

1 题目编号:1005

2 题目内容:

Problem Description
Mr. West bought a new car! So he is travelling around the city.<br><br>One day he comes to a vertical corner. The street he is currently in has a width x, the street he wants to turn to has a width y. The car has a length l and a width d.<br><br>Can Mr. West go across the corner?<br><img src=../../../data/images/2438-1.jpg><br>
 

Input
Every line has four real numbers, x, y, l and w.<br>Proceed to the end of file.<br>
 

Output
If he can go across the corner, print "yes". Print "no" otherwise.<br>
 

Sample Input
  
  
10 6 13.5 4<br>10 6 14.5 4<br>
 

Sample Output
  
  
yes<br>no<br>
 

Source
2008 Asia Harbin Regional Contest Online

3 解题思路形成过程:给定X, Y, l, d判断是否能够拐弯。首先当X或者Y小于d,那么一定不能。其次随着角度θ的增大,最大高度h先增长后减小,即为凸函数,可以用三分法来求解。

4 感想:通过这一个题,我的思路又得到了开阔,知道了二分查找与三分搜索的各自适用范围,二分查找其本身仅适用于类似单调函数一类的问题,而如果是凸函数或凹函数时,就应该考虑三分法了;三分搜索法的思路就是若在[a,b]范围内搜索,则与二分查找法类似先取二者中间值为mid,再在[mid,b]之间取中间值为mmid(或再在[a,mid]之间取中间值为mmid亦可),通过比较f(mid)与f(mmid)的大小来缩小范围,剩余部分与二分法相同。

5 代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
const double pi = 3.1415;
const double eps = 1e-4;
double l, x, y, w;
double calu(double a){
return l*cos(a) + (w - x*cos(a)) / sin(a);
}
double ternary_search(double l, double r){
double L, R;
while (r - l>eps){
L = (2 * l + r) / 3;
R = (2 * r + l) / 3;
if (calu(L)>calu(R))
r = R;
else
l = L;
}
return r;
}
int main()
{
while (cin >> x >> y >> l >> w){
double l = 0, r = pi / 2;
double tmp = ternary_search(l, r);
if (calu(tmp) <= y)
puts("yes");
else
puts("no");
}
return 0;
}

好的,我会根据你的要求给出解答。 迷宫算法是一种解决迷宫问题的算法,其主要思路是通过搜索来找到从起点终点的路径。而广度优先搜索算法是一种图搜索算法,其主要思想是从起点开始,依次将离起点最近的未访问节点加入到队列中,直到找到终点为止。 因此,我们可以将迷宫转换为图,并采用广度优先搜索算法来求解最短路径。具体步骤如下: 1. 读入迷宫地图,并将其转换为图。这里我们可以将每个迷宫的位置看成一个节点,如果两个位置相邻且都可以通过,则两个节点之间连一条边。因此,我们可以使用邻接表来表示图。 2. 采用广度优先搜索算法,从起点开始搜索,将起点加入队列中。 3. 依次从队列中取出节点,并将其未访问的相邻节点加入队列中。 4. 如果找到了终点,返回路径;否则继续搜索直到队列为空。 下面是采用广度优先搜索算法实现迷宫算法的代码,你可以在Dev-C++中运行: ```c++ #include <iostream> #include <queue> #include <vector> using namespace std; const int MAXN = 1005; const int INF = 0x3f3f3f3f; int n, m; char maze[MAXN][MAXN]; int d[MAXN][MAXN]; bool used[MAXN][MAXN]; int sx, sy; int gx, gy; struct Node { int x, y; }; vector<Node> G[MAXN][MAXN]; int dx[] = {1, 0, -1, 0}; int dy[] = {0, 1, 0, -1}; bool bfs() { queue<Node> q; q.push({sx, sy}); while (!q.empty()) { Node p = q.front(); q.pop(); if (p.x == gx && p.y == gy) return true; used[p.x][p.y] = true; for (int i = 0; i < G[p.x][p.y].size(); i++) { int nx = G[p.x][p.y][i].x; int ny = G[p.x][p.y][i].y; if (!used[nx][ny]) { d[nx][ny] = d[p.x][p.y] + 1; used[nx][ny] = true; q.push({nx, ny}); } } } return false; } int main() { cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> maze[i][j]; if (maze[i][j] == 'S') { sx = i; sy = j; } if (maze[i][j] == 'G') { gx = i; gy = j; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (maze[i][j] != '#') { for (int k = 0; k < 4; k++) { int nx = i + dx[k]; int ny = j + dy[k]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] != '#') { G[i][j].push_back({nx, ny}); } } } } } bfs(); cout << d[gx][gy] << endl; return 0; } ``` 在这段代码中,我们使用了一个队列来保存节点,用于实现广度优先搜索算法。同时,我们使用了一个二维数组 `d` 来保存起点到每个节点的距离。在搜索过程中,我们使用一个二维数组 `used` 来记录每个节点是否已经访问过。 最后,我们输出数组 `d` 中终点的值,即为起点到终点的最短路径长度。 需要注意的是,这段代码中只能求出起点到终点的最短路径长度,如果需要求出具体的路径,需要进行一些修改。 综上所述,我们通过采用广度优先搜索算法实现了迷宫算法,并对该算法进行了分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值