TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇
TOJ3973传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3973
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
总提交: 198 测试通过:52
描述
The maze is the same as problem D, and I strongly recommend you solve the previous one first because it.s easier than this.
This time, we want you design the command for our poor robot to move from where it is to its destination. The command sequence.s length should be the shortest. If several solutions exist, find the lexicographically minimum one.
Lexicographical sequence is the order in one dictionary. For example, “cat” is less than “do”, and “do” is less than “dog”.
输入
The first line contains a single integer T, indicating the number of test cases.
Each test case begins with one integer N (1 <= N <= 50), indicating the size of the maze. The followed N lines are N strings whose length is also N, indicating the maze.
输出
For each case, output a command string if there is a solution, otherwise output -1.
样例输入
2
2
S.
#T
4
S#..
.#T.
.##.
....
样例输出
RD
DDDRRRUUL
思路:入门广搜,从S出发到T,如果找得到路径输出字典序最小的那条,找不到则输出-1,可以在结构体内封装一个string属性,在向四个方向搜索的时候,加上对应字的母即可。本题有个小细节是,需要输出的是字典序最小的路径,这点区别于TOJ3128(简单版贪吃蛇),可以在写方向数组的时候,按四个方向的字典序从小到大写,int go[4][2] = {1,0,0,-1,0,1,-1,0}; 这样就可以在找到T的时候直接输出字符串。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<vector>
#define LL long long
#include<assert.h>
using namespace std;
int go[][] = {,,,-,,,-,};
char ma[][];
int vis[][];
struct note{
int x,y;
string s;
}pos,q;
int n;
int check(int x,int y){
if(x < ||x >= n || y < || y >= n)return ;
return ;
}
void bfs(int x,int y,int ex,int ey){
string str[];
int ans = ;
vis[x][y] = ;
queue<note>que;
pos.s = "";
pos.x = x;
pos.y = y;
que.push(pos);
while(que.size()){
q = que.front();
que.pop();
if(q.x == ex && q.y == ey){
cout<<q.s<<endl;return;
}
for(int i = ; i < ; i++){
int dx = q.x + go[i][];
int dy = q.y + go[i][];
if(check(dx,dy) && !vis[dx][dy] && ma[dx][dy] != '#'){
//cout<<q.s<<endl;
pos.x = dx;
pos.y = dy;
if(i == ) pos.s = q.s + "D";
if(i == ) pos.s = q.s + "L";
if(i == ) pos.s = q.s + "R";
if(i == ) pos.s = q.s + "U";
que.push(pos);
vis[dx][dy] = ;
}
}
}
puts("-1");
return;
}
int main(){
int t;
for(scanf("%d",&t);t--;){
int sx,sy,ex,ey;
memset(vis,,sizeof(vis));
scanf("%d",&n);
for(int i = ; i < n ; i++){
scanf("%s",ma[i]);
for(int j = ; j < n ;j ++){
if(ma[i][j] == 'S'){
sx = i;sy = j;
}
if(ma[i][j] == 'T'){
ex = i;ey = j;
}
}
}
bfs(sx,sy,ex,ey);
}
}
TOJ3128传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3128
总提交: 678 测试通过:202 Special Judge
现在我们来简化蛇的身体,假设初始化的时候蛇的身体只有一个头而已(呵,当然是假设的),那么蛇去吃食物的时候就不必考虑碰到自己的身体了。
例:
5 5
.....
S....
###.#
E....
#####
那么从S到E最短的走法是EEESSWWW。说明:N(north),S(south),W(west),E(east)。如果吃不到食物就输出Can't eat it!
注意:路径是最短的走的。
输入
输入数据有多组,每组输入的第一行是两个正整数R,C,表示行和列,3=<R,C<=100,下面输入R行C列的矩阵。
输入保证合法。
输出
每行输出最短的走法。
样例输入
5 5
.....
S....
###.#
E....
#####
样例输出
EEESSWWW
思路:这题也是广搜的入门题,也是对S开始进行广度优先搜素。因为是特判题,所以不需要考虑字典序,注意找不到的时候输出字符串"Can't eat it!"即可。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<vector>
#define LL long long
#include<assert.h>
using namespace std;
int go[][]={{,},{,-},{-,},{,}};
char ma[][];
int vis[][];
struct note{
int x,y;
string s;
}pos,q;
int n,m;
int check(int x,int y){
if(x < ||x >= n || y < || y >= m)return ;
return ;
}
void bfs(int x,int y,int ex,int ey){
vis[x][y] = ;
queue<note>que;
pos.s = "";
pos.x = x;
pos.y = y;
que.push(pos);
while(que.size()){
q = que.front();
que.pop();
if(q.x == ex && q.y == ey){
cout<<q.s<<endl;
return;
}
for(int i = ; i < ; i++){
int dx = q.x + go[i][];
int dy = q.y + go[i][];
if(check(dx,dy) && !vis[dx][dy] && ma[dx][dy] != '#'){
//cout<<q.s<<endl;
pos.x = dx;
pos.y = dy;
if(i == ) pos.s = q.s + "E";
if(i == ) pos.s = q.s + "W";
if(i == ) pos.s = q.s + "N";
if(i == ) pos.s = q.s + "S";
que.push(pos);
vis[dx][dy] = ;
}
}
}
puts("Can't eat it!");
return;
}
int main(){
int t;
while(~scanf("%d %d",&n,&m)){
int sx,sy,ex,ey;
memset(vis,,sizeof(vis));
for(int i = ; i < n ; i++){
scanf("%s",ma[i]);
for(int j = ; j < m ;j ++){
if(ma[i][j] == 'S'){
sx = i;sy = j;
}
if(ma[i][j] == 'E'){
ex = i;ey = j;
}
}
}
bfs(sx,sy,ex,ey);
}
}
TOJ 3973 Maze Again && TOJ 3128 简单版贪吃蛇的更多相关文章
- OC版贪吃蛇
昨天写了一个js版贪吃蛇,今天突然想写一个OC版的,来对比一下两种语言的区别 oc版功能,适配所有尺寸iphone,可暂停,可设置地图和蛇的比例,可加速 对比一下会发现js版的相对OC版的会简单一些, ...
- JavaScript 实现简易版贪吃蛇(Day_13)
时光永远在变迁,你始终要丢下过去. 使用语言 JavaScript 概述 运用JavaScript 实现简易版<贪吃蛇>. Html 页面 1 <!DOCTYPE htm ...
- C#简单实现贪吃蛇程序(LinQ + Entity)
做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity) 最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类 ...
- Java一个简单的贪吃蛇
Java一个简单的贪吃蛇 虽然GUI已经要淘汰了,但是手动写写界面还是有助于理解语法的,像构造函数 ,函数调用,内部类,继承,接口.有助于半初学者强化理解. 直接上代码 游戏主体类: package ...
- 如何用python制作贪吃蛇以及AI版贪吃蛇
用python制作普通贪吃蛇 哈喽,大家不知道是上午好还是中午好还是下午好还是晚上好! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很 ...
- GUI简单实战——贪吃蛇
将前面学到的GUI基础知识完成实战,完成一个简单的贪吃蛇项目 项目功能 用键盘上下左右实现贪吃蛇的自动移动 贪吃蛇吃到食物后,长度加一,分数加一 贪吃蛇吃到自己的身体,则游戏结束 按空格键实现游戏的暂 ...
- js版贪吃蛇
之前没有写博客的习惯,这是我的第一个博客,有些的不好的地方,希望大家多多提意见 js版的贪吃蛇相对比较简单,废话不多说直接上代码,有需要注意的地方我会标红,github源码地址https://gith ...
- 做梦想起来的C#简单实现贪吃蛇程序(LinQ + Entity)
最近一直在忙着单位核心开发组件的版本更新,前天加了一个通宵,昨天晚上却睡不着,脑子里面突然不知怎的一直在想贪吃蛇的实现方法.以往也有类似的情况,白天一直想不通的问题,晚上做梦有时会想到更好的版本,于是 ...
- JavaScript版—贪吃蛇小组件
最近在学习JavaScript,利用2周的时间看完了<JavaScript高级编程>,了解了Js是一门面向原型编程的语言,没有像C#语言中的class,也没有私有.公有.保护等访问限制的级 ...
随机推荐
- leetcode149
/* * A line is determined by two factors,say y=ax+b * * If two points(x1,y1) (x2,y2) are on the same ...
- HBase 入门
使用条件: 海量数据百亿级的行 百万列, 准实时查询 使用场景: 比如金融,交通,电商,移动等 特点: 1:
- ABAP-计算器-动态表达式
data:lv_value type string. call function 'EVAL_FORMULA' exporting formula = '90 <= 90' program = ...
- Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信
Service介绍: 与Acitivity平级的Android四大组件之一,对比Activity而言,就是没有交互界面,且可以一直在后台执行,只用于处理下载,I/O等长时间信息交流的任务. Servi ...
- C#保留小数
四舍五入保留 float a=0.188f; double b=System.Math.Round(a,2);//output: 0.19 直接截取: float f=0.188f; int i=(i ...
- python list元素为dict时的排序
# 简单的dict lst = [('d', 2), ('a', 4), ('b', 3), ('c', 2)] # 按照value排序 lst.sort(key=lambda k: k[1]) pr ...
- Shell函数使用方法
Shell函数是一组命令集或语句组成一个可用块.利用函数可以简化脚本编写.函数要求先定义再使用,调用函数时直接使用函数名即可.这里主要介绍shell编程中函数定义.调用.获取函数参数以及获取函数返回值 ...
- Linux sort命令使用方法
sort命令在Linux中主要用于对文件进行排序,并将排序结果输出.sort命令输入可以是指定的文件和数据流.本文主要介绍sort命令的基本语法和常见使用实例. sort命令语法 sort命令格式:s ...
- 在JSP页面中导入jstl标签库
1 在工程中引用JSTL的两个jar包和标签库描述文件. (1)在项目上右击,从弹出的快捷键菜单中选择Properties命令,在出现的项目属性对话框上,选择DeploymentAssembly. ( ...
- windows 10 专业版 激活
参考文章:https://jingyan.baidu.com/article/c14654134b99de0bfcfc4c8c.html http://www.windowszj.com/news/2 ...