博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3083 Children of the Candy Corn(DFS + BFS)
阅读量:5152 次
发布时间:2019-06-13

本文共 2545 字,大约阅读时间需要 8 分钟。

题意:

求从进入点到出口,分别按靠左边,右边和最短距离到达出口所学要的步数。

思路:

坐标问题弄的稀里糊涂的,引用 discuss 里面的思路吧:

向左:依左上右下的顺序针方向走。根据上一个来的方向判断当前坐标开始走的方向,按顺时针走即可,回溯时经过的格子数也要增加,并且方向要反向向右:依右上左下的逆时针方向走即可最短是普通的 BFS

 

#include 
#include
#include
using namespace std;const int MAXN = 50;struct ST {
int x, y, step; ST(int _x, int _y, int _s) : x(_x), y(_y), step(_s) {}};char grid[MAXN][MAXN];bool vis[MAXN][MAXN];int dir[4][2] = {
{
0,-1}, {
-1,0}, {
0,1}, {
1,0}};int ans;bool lhsDfs(int x, int y, int o, int step) {
if (grid[x][y] == 'E') {
ans = step; return true; } for (int i = o; i < o + 4; ++i) {
int newx = x + dir[i%4][0]; int newy = y + dir[i%4][1]; if (grid[newx][newy] != '#') {
if (lhsDfs(newx, newy, (i-1+4)%4, step+1)) return true; } } return false;}bool rhsDfs(int x, int y, int o, int step) {
if (grid[x][y] == 'E') {
ans = step; return true; } for (int i = o + 4; i > o; --i) {
int newx = x + dir[i%4][0]; int newy = y + dir[i%4][1]; if (grid[newx][newy] != '#') {
if (rhsDfs(newx, newy, (i+1)%4, step+1)) return true; } } return false;}int bfs(int x, int y) {
deque
q; q.push_back(ST(x, y, 1)); vis[x][y] = true; while (!q.empty()) {
ST s = q.front(); q.pop_front(); if (grid[s.x][s.y] == 'E') return s.step; for (int i = 0; i < 4; ++i) {
int newx = s.x + dir[i][0]; int newy = s.y + dir[i][1]; if (grid[newx][newy] != '#' && !vis[newx][newy]) {
vis[newx][newy] = true; q.push_back(ST(newx, newy, s.step + 1)); } } }}int main(){
int cases; scanf("%d", &cases); while (cases--) {
int row, col; scanf("%d %d", &col, &row); memset(grid, '#', sizeof(grid)); for (int i = 1; i <= row; ++i) scanf("%s", &grid[i][1]); int x, y; for (int i = 1; i <= row; ++i) for (int j = 1; j <= col; ++j) if (grid[i][j] == 'S') x = i, y = j; lhsDfs(x, y, 0, 1); printf("%d ", ans); rhsDfs(x, y, 0, 1); printf("%d ", ans); memset(vis, false, sizeof(vis)); printf("%d\n", bfs(x, y)); } return 0;}

转载于:https://www.cnblogs.com/kedebug/archive/2013/03/17/2964415.html

你可能感兴趣的文章
使用Reporting Services时遇到的小问题
查看>>
约瑟夫问题
查看>>
Arduino 报错总结
查看>>
树莓派Android Things物联网开发:树莓派GPIO引脚图
查看>>
矩阵快速幂---BestCoder Round#8 1002
查看>>
js兼容公用方法
查看>>
如何将应用完美迁移至Android P版本
查看>>
【转】清空mysql一个库中的所有表的数据
查看>>
基于wxPython的python代码统计工具
查看>>
淘宝JAVA中间件Diamond详解(一)---简介&快速使用
查看>>
Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
查看>>
Kettle学习系列之Kettle能做什么?(三)
查看>>
【Mac + GitHub】之在另一台Mac电脑上下载GitHub的SSH链接报错
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
35. Search Insert Position(C++)
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
一些php文件函数
查看>>
有关快速幂取模
查看>>