816 - Abbott‘s Revenge (UVA)

2023-12-12 11:52
文章标签 uva revenge abbott 816

本文主要是介绍816 - Abbott‘s Revenge (UVA),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接如下:

Online Judge

刘汝佳大佬的代码如下:

uva 816(经典bfs例子)-CSDN博客

有点抽象,但很简洁。

我自己的代码比较臃肿,又臭又长....而且改了很久才AC。暂时没力气写刘汝佳的版本了...我的代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
// #define debugstruct loc{int r, c, prev;char direction;loc(int _r, int _c, int _prev, char _d): r(_r), c(_c), prev(_prev), direction(_d){}
};
std::string name, direction, str;
int startR, startC, exitR, exitC, r, c, pivot, nextR, nextC;
std::vector<std::string> dir[10][10];
std::vector<std::string> empty;
std::vector<int> path;
std::vector<loc> vec;
bool flag, newloc;
char d, newd;bool isValid(int u, int v){if (u < 1 || u > 9 || v < 1 || v > 9){return false;}return true;
}void printPath(){int p = vec.size() - 1;do {path.push_back(p);p = vec[p].prev;} while (p >= 0);reverse(path.begin(), path.end());for (int i = 0; i < path.size(); ++i){printf(" (%d,%d)", vec[path[i]].r, vec[path[i]].c);if ((i + 1) % 10 == 0){printf("%s", i == path.size() - 1 ? "\n" : "\n ");} else if (i == path.size() - 1){printf("\n");}}
}int main(){#ifdef debugfreopen("0.txt", "r", stdin);freopen("1.txt", "w", stdout);#endifwhile (std::cin >> name && name != "END"){printf("%s\n ", name.c_str());for (int i = 1; i <= 9; ++i){for (int j = 1; j <= 9; ++j){dir[i][j] = empty;}}vec.clear();path.clear();flag = false;std::cin >> startR >> startC >> direction >> exitR >> exitC;while (std::cin >> r && r){std::cin >> c;while (std::cin >> str && str != "*"){dir[r][c].push_back(str);}}r = startR;c = startC;if (direction == "E"){c++;} else if (direction == "W"){c--;} else if (direction == "S"){r++;} else if (direction == "N"){r--;}if (r == exitR && c == exitC){printf(" (%d,%d) (%d,%d)\n", startR, startC, r, c);continue;}vec.push_back(loc(startR, startC, -1, ' '));vec.push_back(loc(r, c, 0, direction[0]));pivot = 1;while (pivot < vec.size()){r = vec[pivot].r;c = vec[pivot].c;d = vec[pivot].direction;for (int i = 0; i < dir[r][c].size(); ++i){if (dir[r][c][i][0] == d){for (int j = 1; j < dir[r][c][i].size(); ++j){nextR = r;nextC = c;if (dir[r][c][i][j] == 'L'){if (d == 'E'){newd = 'N';} else if (d == 'N'){newd = 'W';} else if (d == 'S'){newd = 'E';} else if (d == 'W'){newd = 'S';}} else if (dir[r][c][i][j] == 'R'){if (d == 'E'){newd = 'S';} else if (d == 'N'){newd = 'E';} else if (d == 'W'){newd = 'N';} else if (d == 'S'){newd = 'W';}} else if (dir[r][c][i][j] == 'F'){newd = d;}if (newd == 'E'){nextC++;} else if (newd == 'W'){nextC--;} else if (newd == 'S'){nextR++;} else if (newd == 'N'){nextR--;}newloc = true;for (int k = 0; k < vec.size(); ++k){if (vec[k].r == nextR && vec[k].c == nextC && vec[k].direction == newd){newloc = false;break;}}if (newloc && isValid(nextR, nextC)){vec.push_back(loc(nextR, nextC, pivot, newd));if (nextR == exitR && nextC == exitC){printPath();i = dir[r][c].size();pivot = vec.size();flag = true;break;}}}}}pivot++;}if (!flag){printf(" No Solution Possible\n");}}#ifdef debugfclose(stdin);fclose(stdout);#endifreturn 0;
}

这篇关于816 - Abbott‘s Revenge (UVA)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/484560

相关文章

UVA - 12206 Stammering Aliens (hash)

这题其实很容易想到2分长度,关键是2分后,怎么判断出现最多次的串是否》=m次了。这里需要用到hash来处理。 对于一个字符串   H[i] =H[i+1]*131+s[i]  ;其中 H[n]=0;那么对于一个长度为L的串 ,hanh[i,l]=H[i]-H[i+L]*x^L ; 这样记录每个字符串的hash值,然后再处理起来就比较简单了。 VIEW CODE #include<

[Uva 11990] Dynamic Inversion (CDQ分治入门)

Uva - 11990 动态逆序对,求删除一个点之前序列中逆序对的个数 首先倒过来看这个问题,把点先全部删掉 然后从最后一个点开始倒着往数列中加点 求加完这个点逆序对的变化 CDQ分治做法 把删除时间看作 t,下标看作 x,值看作 y 然后对 x排序,对 t偏序,用树状数组维护 y 具体来说就是对于每个点 (t0,x0,y0) (t_0, x_0, y_0) 先统计

UVA 11624 搜索

给出1000*1000矩阵,含起点‘J’,路‘.',墙‘#’,火‘F'; 火每秒蔓延一格,人每秒走一步 问人是否可以安全走出矩阵,不能被火碰到 先对所有火BFS一遍,记录每个点被烧到的时间 然后对人BFS一遍,若到每点前没被火烧即可走 #include "stdio.h"#include "string.h"#include "queue"using namespace

UVa 11361 Investigating Div-Sum Property

这道题居然提交了十次才过....期间小问题不断。思路的话基本是《训练指南》里面来的,不过有几个小问题需要注意一下。第一,当K在大于100的情况下,就直接输出0就可以了。因为a,b不超过2^31,可以估算出a,b最多十位十进制数,那么每位最大为9,所以各个数字之和是不可能超过100的,那么个数字之和为模K为0的条件是永远不可能到达的。       还有一点是,当剩余数字d=0时,当且

UVa 1362(LA 3516) Exploring Pyramids

依旧是《训练指南》上的一道例题。思路大致相同,即设有一个序列S(i),S(i+1),S(i+2)...S(j),d[i,j]为所求的解。当S(i)==S(k),i<k<=j 时,说明在k回到根,那么S(i+1)...S(k-1)构成一棵独立的子树(当然也可能并不是子树)。那么d[i,j]就要加上d[i+1,k-1]*d[k,j],不断递增k,每遇到一个k,d[i,j]+=d[i

UVa 11174 Stand in a Line

依旧是《训练指南》上的一道例题。书上讲的比较抽象,下面就把解法具体一下。因为涉及到父子关系,因此自然而然可以将n个节点构造成一棵树,最后将形成一个森林。接下来将使用递归的手法。设f(i)是以节点i为树根的子树,节点i有儿子c1,c2,c3....cj共j棵子树。s[i]为树根为i的子树包含的节点数。如果分别先给各个子树内部排序,那么毫无疑问, 共有f(c1)*f(c2)*f(c3).

UVa 11375 Matches

大年夜的写代码果然状态非常之差...感觉特别困,连个高精度都折腾了我好久。还是刘汝佳《训练指南》里的一道例题,解题思路其实也差不多,但是想对书里面的内容再讲讲。其中d[i]是代表i个火柴棒恰好能构成的正整数数目(不包含整数0),然后有点类似于动态规划的做法,通过已知的d[]求出剩下的d[]。        不过仔细想来貌似有点问题。例如已知d[j],那么d[j+num[0]]+=d[

UVa CD 0-1背包且打印路径

就是简单的0-1背包问题,不过没有具体的效益值,隐含的效益值就是剩余背包的容量。因为要输出具体选择了那些track(也就是物品),所以采用序偶的方法。其实0-1背包的解画在坐标轴上就是一个分段函数,所谓序偶就是那些跃迁的节点。但是这道题略有不同,第0阶段的初始序偶不是(0,0),而是(0,N)。序偶的第一个参数表示容量,第二个参数表示背包的剩余容量。当由前一阶段的序偶得到新序偶,并且

UVa 116 Unidirectional TSP

这道题是非常基础的动态规划,类似于分阶段决策。题意是:一个M*N的数组,要求从第1列走到第N列且下一步的位置都只能是当前位置的相邻右侧,相邻右上,相邻右下三个位置。要求路径上的格子内的数字和最小。若有和相同的路径,则输出字典序最小的那一条路径。解法其实就是设置一个记忆数组,分阶段决策即可。         但是决策有从左往右和从右往左两种方式。开始我使用的从左往右的方式,这稍微麻

UVA 103--- Stacking Boxes

这道题在小白书中的分类是动态规划,把题AC了之后在网上看解题报告后,多数解法也是DAG上的动态规划。但其实一个简单的深度优先就能解决问题了。首先将每数从大到小排序,再将各组按照排序后的第一个数字的大小进行从大到小排序。需要注意的是,记录各组数据的编号也要和数进行同步的排序。 #include <iostream>#include <cstdio>#include <vect