UVa 10047 - The Monocycle (多状态BFS)
时间:2021-07-16
本文章向大家介绍UVa 10047 - The Monocycle (多状态BFS),主要包括UVa 10047 - The Monocycle (多状态BFS)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=0&problem=988&mosmsg=Submission+received+with+ID+26578514
\(d[x][y][dir][c\) 记录位置,朝向,颜色,\(BFS\) 求解即可
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 55;
const int INF = 0x3f3f3f3f;
int n, m;
char ch[maxn];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
int sx, sy, tx, ty;
int a[maxn][maxn];
int d[maxn][maxn][10][10];
int vis[maxn][maxn][10][10];
int tc[10] = {1, 2, 3, 4, 0};
int td[2][10] = {{1, 2, 3, 0}, {3, 0, 1, 2}}; // 0 N 1 E 2 S 3 W
struct Node{
int x, y, d, c;
Node(int x, int y, int d, int c): x(x), y(y), d(d), c(c) {};
};
int bfs(){
memset(vis, 0, sizeof(vis));
memset(d, 0x3f, sizeof(d));
queue<Node> q;
d[sx][sy][0][0] = 0;
q.push(Node(sx, sy, 0, 0));
while(!q.empty()){
Node p = q.front(); q.pop();
if(vis[p.x][p.y][p.d][p.c]) continue;
vis[p.x][p.y][p.d][p.c] = 1;
if(p.x == tx && p.y == ty && p.c == 0){
return d[p.x][p.y][p.d][p.c];
}
// int x = p.x + dx[p.d], y = p.y + dy[p.d], c = tc[p.c]; // 移动
int x = p.x + dx[p.d], y = p.y + dy[p.d], c = tc[p.c];
if(x >= 1 && x <= n && y >= 1 && y <= m && !a[x][y] && !vis[x][y][p.d][c]){
d[x][y][p.d][c] = d[p.x][p.y][p.d][p.c] + 1;
q.push(Node(x, y, p.d, c));
}
for(int i = 0 ; i < 2 ; ++i){ // 转向
int dir = td[i][p.d];
if(!vis[p.x][p.y][dir][p.c]){
d[p.x][p.y][dir][p.c] = d[p.x][p.y][p.d][p.c] + 1;
q.push(Node(p.x, p.y, dir, p.c));
}
}
}
return INF;
}
ll read(){ ll s = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * f; }
int main(){
int flag = 0;
int kase = 0;
while(scanf("%d%d", &n, &m) && (n || m)){
if(flag) printf("\n");
flag = 1;
for(int i = 1 ; i <= n ; ++i){
scanf("%s", ch + 1);
for(int j = 1 ; j <= m ; ++j){
if(ch[j] == '#') a[i][j] = 1;
else if(ch[j] == '.'){
a[i][j] = 0;
} else if(ch[j] == 'S'){
sx = i, sy = j;
a[i][j] = 0;
} else{
tx = i, ty = j;
a[i][j] = 0;
}
}
}
int ans = bfs();
printf("Case #%d\n", ++kase);
if(ans != INF) printf("minimum time = %d sec\n", ans);
else {
printf("destination not reachable\n");
}
}
return 0;
}
原文地址:https://www.cnblogs.com/tuchen/p/15021950.html
- socket中的byte消息格式设计
- 在silverlight中利用socket发送图片或文件
- 多线程中的ManualResetEvent
- 进程与线程
- ASP.NET TreeView相关问题
- 温故而知新:WinForm/Silverlight多线程编程中如何更新UI控件的值
- ASP.Net Web Page深入探讨
- 用Design+Blend轻松制作环形文字
- 对asp.net响应事件的试验
- 为服务器控件加入客户端事件处理的几种方法
- 温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件
- 如何在Silverlight4中使用摄像头
- Flask的集中控制
- 64位IIS(IIS6/IIS7)上跑Asp + Jet.Oledb的设置要点
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring profile配置应用
- Spring Bean的加载
- Spring ApplicationContext 简介
- Spring 配置String转Date
- zookeeper事务
- Thread Object wait() notify()基本
- 基本排序算法(冒泡排序 选择排序 插入排序 快速排序 归并排序 基数排序 希尔排序)
- Java加解密AES、DES、TripleDES、MD5、SHA
- Java 根据经纬度计算两点之间的距离
- mysql bin log配置及查看
- mybatis interceptor 处理查询参数及查询结果
- Mybatis基础
- java mix 知识点
- js 加密 crypto-js des加密
- jvm 语法糖