题目:

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

code:

#include <stdio.h>
#define MAXN 1001
#define LEFT 0
#define TOP 1
#define RIGHT 2
#define BOTTOM 3
struct block{
//left,top,right,bottom
int doors[];
int doors_num;
int rotats;
int minutes;
};
struct block labyrinth[MAXN][MAXN];
char visited[MAXN][MAXN]; struct node{
int x;
int y;
};
int top;
struct node path[MAXN*MAXN];
int N,M;
int xt,yt,xm,ym;
int min_minutes = 0x0FFFFFFF;
void init_doors(int x,int y,char c)
{
int i;
for (i=;i<;i++)
{
labyrinth[x][y].doors[i] = ;
}
labyrinth[x][y].doors_num =;
labyrinth[x][y].rotats = ;
labyrinth[x][y].minutes = 0x0FFFFFFF;
switch(c)
{
case '+':
for (i=;i<;i++)
{
labyrinth[x][y].doors[i] = ;
}
labyrinth[x][y].doors_num = ;
labyrinth[x][y].rotats = ;
break;
case '-':
labyrinth[x][y].doors[LEFT] = ;
labyrinth[x][y].doors[RIGHT] =;
labyrinth[x][y].doors_num = ;
break;
case '|':
labyrinth[x][y].doors[TOP] = ;
labyrinth[x][y].doors[BOTTOM] =;
labyrinth[x][y].doors_num = ;
break;
case '^':
labyrinth[x][y].doors[TOP] = ;
labyrinth[x][y].doors_num = ;
break;
case '>':
labyrinth[x][y].doors[RIGHT] = ;
labyrinth[x][y].doors_num = ;
break;
case '<':
labyrinth[x][y].doors[LEFT] = ;
labyrinth[x][y].doors_num = ;
break;
case 'V':
labyrinth[x][y].doors[BOTTOM] = ;
labyrinth[x][y].doors_num = ;
labyrinth[x][y].rotats = ;
break;
case 'L':
labyrinth[x][y].doors[TOP] = ;
labyrinth[x][y].doors[BOTTOM] =;
labyrinth[x][y].doors[RIGHT] = ;
labyrinth[x][y].doors_num =;
labyrinth[x][y].rotats = ;
break;
case 'R':
labyrinth[x][y].doors[TOP] = ;
labyrinth[x][y].doors[BOTTOM] =;
labyrinth[x][y].doors[LEFT] = ;
labyrinth[x][y].doors_num = ;
labyrinth[x][y].rotats = ;
break;
case 'U':
labyrinth[x][y].doors[RIGHT] = ;
labyrinth[x][y].doors[BOTTOM] =;
labyrinth[x][y].doors[LEFT] = ;
labyrinth[x][y].doors_num = ;
break;
case 'D':
labyrinth[x][y].doors[TOP] = ;
labyrinth[x][y].doors[RIGHT] =;
labyrinth[x][y].doors[LEFT] = ;
labyrinth[x][y].doors_num = ;
break;
}
}
void push(int i,int j)
{
top++;
path[top].x = i;
path[top].y = j; }
struct node pop()
{
top--;
return path[top +];
}
int get_door(int x,int y,int direction,int roates)
{
int t = roates % ;
int index = direction - t;
if (index < )
{
index += ;
} return labyrinth[x][y].doors[index]; }
void process_state(int x,int y,int cur_rotates,int cur_time)
{
int dir_y[] = {-,,,};
int dir_x[] = { ,-,,};
int i,nx,ny;
for (i=;i<;i++)
{
nx = x+dir_x[i];
ny = y+dir_y[i];
if (nx< || nx >N)
{
continue;
}
if (ny< || ny>M)
{
continue;
}
if (get_door(x,y,i,cur_rotates)&& get_door(nx,ny,(i+)%,cur_rotates))
{
if (!visited[nx][ny])
{
visited[nx][ny] =;
labyrinth[nx][ny].minutes = cur_time+;
labyrinth[nx][ny].rotats = cur_rotates;
if (nx == xm && ny == ym)
{
if (min_minutes > cur_time+)
{
min_minutes = cur_time+;
}
}else
{ push(nx,ny);
} }else
{
if (labyrinth[nx][ny].minutes >cur_time+ )
{
labyrinth[nx][ny].minutes = cur_time+;
labyrinth[nx][ny].rotats = cur_rotates;
push(nx,ny);
}
}
} }
}
int bfs()
{
int x,y,cur_rotates,i,nx,ny,t,cur_time; struct node cur;
top = -;
push(xt,yt);
labyrinth[xt][yt].minutes = ;
visited[xt][yt] =; while(top!= -)
{
cur = pop(); //left
x = cur.x;
y = cur.y;
cur_rotates = labyrinth[x][y].rotats;
cur_time = labyrinth[x][y].minutes;
t = ;
while(t < )
{
if (cur_time + t < min_minutes)
{
process_state(x,y,cur_rotates+t,cur_time+t);
}
t++; }
}
return labyrinth[xm][ym].minutes; }
int main()
{
int i,j;
char str[MAXN];
scanf("%d %d",&N,&M);
for (i=;i<=N;i++)
{
scanf("%s ",str);
for (j=;j<=M;j++)
{ init_doors(i,j,str[j-]);
visited[i][j] = ;
}
}
scanf("%d %d",&xt,&yt);
scanf("%d %d",&xm,&ym);
//check same logcation
if (xt == xm && yt == ym)
{
printf("");
return ;
}
//dfs(xt,yt,0); bfs();
if(min_minutes == 0x0FFFFFFF)
printf("-1");
else
printf("%d",min_minutes); return ;
}

CodeForces 676D代码 哪里有问题呢?的更多相关文章

  1. codeforces 676D Theseus and labyrinth BFS搜索

    分析:一个n*m的矩阵,每个格子有12个状态,每次按一次,每个格子转90度,所以整个矩阵只有4种状态,然后爆搜就好了 #include <cstdio> #include <iost ...

  2. CodeForces 676D Theseus and labyrinth

    最短路. $dis[i][j][k]$记录到点$(i,j)$,门的状态为$k$时的最短路.转移的时候有$8$种方案,即直接走向周围四个点,或者进行旋转.比较烦的是判断两个相邻的点在状态$k$下是否连通 ...

  3. Codeforces Round #754 (Div. 2) C. Dominant Character

    题目:Problem - C - Codeforces 如代码,一共有七种情况,注意不要漏掉  "accabba"  , "abbacca"  两种情况: 使用 ...

  4. XTU1266:Parentheses(贪心+优先队列)

    传送门 题意 从左到右有n个连续的组,每一组有Li个括号,要么全是左括号,要么全是右括号,以及该组的每一个左括号翻成右括号, 或者右括号翻成左括号的花费Di.可以对这n个组的括号进行翻转,每一个括号都 ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 I. query 树状数组

    I. query 题目链接: Problem Description Given a permutation \(p\) of length \(n\), you are asked to answe ...

  6. CodeForces - 950C Zebras 模拟变脑洞的天秀代码

    题意:给你一个01串,问其是否能拆成若干形如0101010的子串,若能,输出所有子串的0,1 的位置. 题解:一开是暴力,然后瞎找规律, 最后找到一种神奇的线性构造法:扫一遍字符串,若为0就一直竖着往 ...

  7. Educational Codeforces Round 50 (Rated for Div. 2)的A、B、C三题AC代码

    A题链接:https://codeforces.com/contest/1036/problem/A A题AC代码: #include <stdio.h> #include <std ...

  8. Codeforces Round #334(div.2)(新增不用二分代码) B

    B. More Cowbell time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  9. Codeforces Round #352 (Div. 2),A题与B题题解代码,水过~~

    ->点击<- A. Summer Camp time limit per test 1 second memory limit per test 256 megabytes input s ...

随机推荐

  1. Linux find 用法示例

    Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数 ...

  2. .NET LINQ 筛选数据

    筛选数据      筛选指将结果集限制为只包含那些满足指定条件的元素的操作. 它又称为选择. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 OfType ...

  3. c语言for循环

    #include<stdio.h>#include<windows.h>#include <limits.h>#include <math.h>void ...

  4. c语言中在引用math库后,编译出现错误(.text+0x9c):对‘sqrt’未定义的引用的解决办法

    写于2016年11月29日晚. 原因是gcc编译器没有引用默认的math库,需要在执行编译命令时加上-ml.例如: gcc 源文件 -ml -o 编译后文件名 或者 gcc 源文件 -lm -o 编译 ...

  5. Linux安装Go语言

    1.下载Go语言安装包https://storage.googleapis.com/golang/go1.7.1.linux-amd64.tar.gz 2.在命令行执行如下命令: sudo tar - ...

  6. 关于Xcode8.1 / iOS10+ 真机测试系统打印或者宏定义打印不显示问题

    前言: 最近做项目时遇到了很多莫名其妙的问题,其中就有这个打印(NSLog).也不多废话了,我们先来回顾一下Xcode8发布以来,我们遇到的一些关于打印的问题,当然也有解决方法: 1.Xcode8打印 ...

  7. 基于Proteus仿真的Arduino学习(1)——Arduino Uno最小系统及LED的简单使用

    一.前言:  A.Arduino简介 Arduino是由一个欧洲开发团队于2005年冬季开发.其成员包括Massimo Banzi.David Cuartielles.Tom Igoe.Gianluc ...

  8. 【Oracle】去除表中重复的数据

    删除表重复数据 (t1表中有重复数据)1.使用distinct create table t2 as select * from t1;create table tmp_t2 as select di ...

  9. [转] 《ES6标准入门》读书笔记

    来源:https://segmentfault.com/a/1190000005863641 let和const命令 ES6新增let命令,用于声明变量,是块级作用域. let声明的变量不会像var声 ...

  10. 二十四点算法 java实现

    问题: 给出四个数,不可以重复使用,可以用+ - * /和括号,怎么得出24? 代码: //return -1 表示当前方法不行 private int workByStep(int op,int n ...