CF div2 D BFS

http://codeforces.com/contest/676/problem/D

题目大意:

勇者去迷宫杀恶龙。迷宫是有n*m的方格子组成的。迷宫上有各种记号,这些记号表达着能走的方向。当且仅当两个房间的记号是相互联通的,才能走过去。

我们有如下选择,最直白的一种就是直接走到另外一个格子上去(当然格子得相互连通),第二种操作就是顺时针旋转所有的格子(格子的位置保持不变)。

问,勇者要多久才能走到恶龙所在的地方。

 

思路:

表示这道题真心不会。。。下面的这个代码也是参考了别人的吧。。。换成我的话for的循环里面肯定不会写成f*3+i之类的(虽然这个到现在还没有弄明白)

 

我们用结构体保存当前的位置,旋转的次数和行走的距离。然后我们每次对一个当前的格子进行两种操作

①瞬时间旋转操作(每次都旋转1,反正最后肯定会遍历到4的)

②就是枚举上下左右,看看是否能走过去。

然后就OK了

 

  1 //看看会不会爆int!
  2 #include <bits/stdc++.h>
  3 using namespace std;
  4 #define ll long long
  5 #define pb push_back
  6 #define mk make_pair
  7 #define fi first
  8 #define se second
  9 #define all(a) a.begin(), a.end()
 10 
 11 const int maxn = 1005;
 12 bool vis[maxn][maxn][10];
 13 int n, m;
 14 struct point{
 15     int x, y;
 16     int f, d;
 17     point(int xx = 0, int yy = 0, int ff = 0, int dd = 0){
 18         x = xx, y = yy, f = ff, d = dd;
 19     }
 20 }p[maxn][maxn];
 21 
 22 char atlas[maxn][maxn];
 23 int xt, yt, xm, ym;
 24 /*
 25 int dx[] = {0, 0, -1, 1};//上下左右
 26 int dy[] = {-1, 1, 0, 0};
 27 */
 28 int dx[] = {-1, 0, 1, 0};//左下右上
 29 int dy[] = {0, 1, 0, -1};
 30 
 31 bool check(char ch, int dir){
 32     if (dir == 0) return ch == '+' || ch == '|' || ch == '^' || ch == 'L' || ch == 'R' || ch == 'D';
 33     else if (dir == 1) return ch == '+' || ch == '-' || ch == '>' || ch == 'L' || ch == 'U' || ch == 'D';
 34     else if (dir == 2) return ch == '+' || ch == '|' || ch == 'v' || ch == 'L' || ch == 'R' || ch == 'U';
 35     else  return ch == '+' || ch == '-' || ch == '<' || ch == 'R' || ch == 'U' || ch == 'D';
 36     return 0;
 37 }
 38 
 39 int bfs(){
 40     queue <point> que;
 41     vis[xt][yt][0] = 1;
 42     que.push(point(xt, yt, 0, 0));
 43     while (!que.empty()){
 44         point q = que.front();
 45         que.pop();
 46         int x = q.x, y = q.y;
 47         int f = q.f, d = q.d;
 48         if (x == xm && y == ym) return d;
 49         if (!vis[x][y][(f + 1) % 4]){
 50             vis[x][y][(f + 1) % 4] = true;
 51             que.push(point(x, y, (f + 1) % 4, d + 1));
 52         }
 53         for (int i = 0; i < 4; i++){
 54             int nx = x + dx[i], ny = y + dy[i];
 55             if (nx <= 0 || ny <= 0 || nx > n || ny > m) continue;
 56             if (atlas[nx][ny] == '*' || vis[nx][ny][f]) continue;
 57             if (!check(atlas[x][y], (f * 3 + i) % 4)) continue;//我们要选择的是和上面相反的方向
 58             if (!check(atlas[nx][ny], (f * 3 + i + 2) % 4)) continue;
 59             que.push(point(nx, ny, f, d + 1));
 60             vis[nx][ny][f % 4] = true;
 61         }
 62     }
 63     return -1;
 64 }
 65 
 66 int main(){
 67 #ifndef ONLINE_JUDGE
 68     freopen("input.txt", "r", stdin);
 69 #endif
 70     scanf("%d%d", &n, &m);
 71     for (int i = 1; i <= n; i++){
 72         scanf("%s", atlas[i] + 1);
 73     }
 74     scanf("%d%d", &xt, &yt);
 75     scanf("%d%d", &xm, &ym);
 76     int ans = bfs();
 77     printf("%d\n", ans);
 78   return 0;
 79 }
 80 /*
 81                    _ooOoo_
 82                   o8888888o
 83                   88" . "88
 84                   (| -_- |)
 85                   O\  =  /O
 86                ____/`---'\____
 87              .'  \\|     |//  `.
 88             /  \\|||  :  |||//  \
 89            /  _||||| -:- |||||-  \
 90            |   | \\\  -  /// |   |
 91            | \_|  ''\---/''  |   |
 92            \  .-\__  `-`  ___/-. /
 93          ___`. .'  /--.--\  `. . __
 94       ."" '<  `.___\_<|>_/___.'  >'"".
 95      | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 96      \  \ `-.   \_ __\ /__ _/   .-` /  /
 97 ======`-.____`-.___\_____/___.-`____.-'======
 98                    `=---='
 99 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
100          佛祖保佑       永无BUG
101 */
View Code

 

转载于:https://www.cnblogs.com/heimao5027/p/5544351.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值