SPOJ LAS(BFS)题解
题目:VJ
思路:
BFS+回溯,但是要剪枝,看了dalao的题解,超时+WA无数发,终于过了
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<queue>
#include<cmath>
//#include<map>
#include<string>
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f
const int N=300;
using namespace std;
char map[N][N];
char dir[N][N];
int vis[N][N],fx[N][N],fy[N][N];
int n,m,sx,sy,ex,ey,to[4][2]={1,0,-1,0,0,1,0,-1};
char turn[4]={'d','u','r','l'};
struct node{
	int x,y;
	int step;
	int i;
};
queue<node> q;
void init(){
	memset (vis,-1,sizeof(vis));
	while(!q.empty()) q.pop();
}
int judge(int x,int y,int step){
	if(x>=1 && x<=n && y>=1 && y<=m && map[x][y]!='#' && (vis[x][y]==-1 || vis[x][y]==step)) return 1;
	return 0;
}
void add(int x,int y,int i,int step){
	node a;
	x+=to[i][0];
	y+=to[i][1];
	while(judge(x,y,step)){
		if(vis[x][y]!=step){
			dir[x][y]=turn[i];
			vis[x][y]=step;
			fx[x][y]=x-to[i][0];
			fy[x][y]=y-to[i][1];
			a.i=i;
			a.x=x;
			a.y=y;
			a.step=step;
			q.push(a);
		}
		x+=to[i][0];
		y+=to[i][1];
	}
}
void paint(int i){
	int x,y,tx,ty;
	tx=fx[ex][ey];
	ty=fy[ex][ey];
	x=ex;
	y=ey;
	while(tx!=sx || ty!=sy){
		char wh=dir[tx][ty];
		char go=dir[x][y];
		if(wh!=go){
			if(wh=='u'){
				if(go=='l'){
					map[tx][ty]='\\';
				}
				else if(go=='r'){
					map[tx][ty]='/';
				}
			}
			else if(wh=='d'){
				if(go=='r'){
					map[tx][ty]='\\';
				}
				else if(go=='l'){
					map[tx][ty]='/';
				}
			}
			else if(wh=='l'){
				if(go=='u'){
					map[tx][ty]='\\';
				}
				else if(go=='d'){
					map[tx][ty]='/';
				}
			}
			else if(wh=='r'){
				if(go=='d'){
					map[tx][ty]='\\';
				}
				else if(go=='u'){
					map[tx][ty]='/';
				}
			}
		}
		x=tx;
		y=ty;
		tx=fx[x][y];
		ty=fy[x][y];
	}
}
void bfs(int dd){
	int x,y;
	init();
	node a,b;
	vis[sx][sy]=100000;
	dir[sx][sy]='o';
	add(sx,sy,dd,0);
	while(!q.empty()){
		a=q.front();
		q.pop();
		if(a.x==ex && a.y==ey){
			paint(a.i);
			return;
		}
		b.step=a.step+1;
		for(int i=0;i<4;i++){
			b.x=a.x+to[i][0];
			b.y=a.y+to[i][1];
			if(judge(b.x,b.y,b.step)){
				add(a.x,a.y,i,b.step);
			}
		}
	}
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++){
			scanf("%s",map[i]+1);
			for(int j=1;j<=m;j++){
				if(map[i][j]=='C'){
					ex=i;ey=j;
				}
				else if(map[i][j]=='<' || map[i][j]=='>' || map[i][j]=='v' || map[i][j]=='^'){
					sx=i;sy=j;
				}
			}
		}
		//to[4][2]={1,0,  -1,0,  0,1,  0,-1}
		int direction;
		if(map[sx][sy]=='<') direction=3;
		else if(map[sx][sy]=='>') direction=2;
		else if(map[sx][sy]=='^') direction=1;
		else direction=0; 
		bfs(direction);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				printf("%c",map[i][j]);
			}
			printf("\n");
		}
	}
	return 0;
}SPOJ LAS(BFS)题解的更多相关文章
- DFS与BFS题解:[kaungbin]带你飞 简单搜索 解题报告
		DFS and BFS 在解题前我们还是大致讲一下dfs与bfs的.(我感觉我不会bfs) 1.DFS dfs(深度优先算法) 正如其名,dfs是相当的深度,不走到最深处绝不回头的那种. 深度优先搜 ... 
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
		剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ... 
- 畅通工程(自己写的BFS,但后面想了下并查集更好更快)
		某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ... 
- AcWing:177. 噩梦(bfs)
		给定一张N*M的地图,地图中有1个男孩,1个女孩和2个鬼. 字符“.”表示道路,字符“X”表示墙,字符“M”表示男孩的位置,字符“G”表示女孩的位置,字符“Z”表示鬼的位置. 男孩每秒可以移动3个单位 ... 
- HDU 1560 DNA sequence (IDA* 迭代加深 搜索)
		题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1560 BFS题解:http://www.cnblogs.com/crazyapple/p/321810 ... 
- 洛谷P1605走迷宫
		传送 这是一道dfs,但是...但是....但是它竟然被放在bfs练习题辣!!!! 打了半天bfs,发现路径不会标记了,于是发现好像有什么不对的,似乎dfs要简单一点,于是半路跑去打dfs,结果打了半 ... 
- 记 2020蓝桥杯校内预选赛(JAVA组) 赛后总结
		目录 引言 结果填空 1. 签到题 2. 概念题 3. 签到题 4. 签到题 程序题 5. 递增三元组[遍历] 6. 小明的hello[循环] 7. 数位递增[数位dp] 8. 小明家的草地[bfs] ... 
- “盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛题解&&源码【A,水,B,水,C,水,D,快速幂,E,优先队列,F,暴力,G,贪心+排序,H,STL乱搞,I,尼姆博弈,J,差分dp,K,二分+排序,L,矩阵快速幂,M,线段树区间更新+Lazy思想,N,超级快速幂+扩展欧里几德,O,BFS】
		黑白图像直方图 发布时间: 2017年7月9日 18:30 最后更新: 2017年7月10日 21:08 时间限制: 1000ms 内存限制: 128M 描述 在一个矩形的灰度图像上,每个 ... 
- HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解
		Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ... 
随机推荐
- memcached-session-manager 教程实现session共享
			1简单介绍 1.1决定用什么序列化策略. 1.2配置tomcat 1.2.1加入 memcached-session-manager jar 包到tomcat中. ... 
- 开发安卓安装流程(codorva+ionic)
			开发安卓安装流程 0 安装操作系统 Win10 用户名称尽量英文字母加数字,避免编码问题 1 安装Java sdk 1.8.0_45 所需文件 jdk-8u45-windows-x64 1. ... 
- EditPlus 5.0 中文版已经发布(3月26日更新)
			注意:新版本不再支持旧的注册码! 新特性: - Ctrl+Alt+Up/Down 键可添加多个插入点以及进行列选择 - Alt+鼠标点击可添加多个插入点 - 连续执行“选择单词”命令可将多个选中项添加 ... 
- python进程、多进程
			进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当 ... 
- ACM竞赛之输入输出(以C与C++为例)
			本文转自互联网,内容.排版有修正. 欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju G ... 
- RocketMQ事务消费和顺序消费详解
			一.RocketMq有3中消息类型 1.普通消费 2. 顺序消费 3.事务消费 顺序消费场景 在网购的时候,我们需要下单,那么下单需要假如有三个顺序,第一.创建订单 ,第二:订单付款,第三:订单完成. ... 
- java commons.lang3 ArrayUtils使用
			java commons.lang3 ArrayUtils使用import org.apache.commons.lang3.ArrayUtils; /** *数组追加数组,不重复 */ public ... 
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
			python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ... 
- MySQL数据库----流程控制
			流程控制 1.条件语句 举例一 delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THE ... 
- SQL锁机制和事务隔离级别
			摘自:http://www.cnblogs.com/haiyang1985/archive/2009/02/27/1399641.html 锁机制 NOLOCK和READPAST的区别. 1. ... 
