题目:

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. ASM:《X86汇编语言-从实模式到保护模式》第17章:保护模式下中断和异常的处理与抢占式多任务

    ★PART1:中断和异常概述 1. 中断(Interrupt) 中断包括硬件中断和软中断.硬件中断是由外围设备发出的中断信号引发的,以请求处理器提供服务.当I/O接口发出中断请求的时候,会被像8259 ...

  2. MediaElement.js对不同浏览器的支持

    目前已经有很多html5播放器可以使用,使用html5播放器可以轻松的在页面中插入媒体视频,从而使我们的web页面变得更加丰富多彩,所以今天向大家推荐一款非常优秀的html5播放器MediaEleme ...

  3. 懵逼的闭包--for循环(转)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Schwarz积分公式

    设$f\in H(B(0,R))\cap C(\overline{B(0,R)})$,且$f=u+iv$,则$f$可用其实部表示为 $$f(z)=\frac{1}{2\pi}\int_{0}^{2\p ...

  5. Android开发之---AIDL

    在Android开发中,有时会用到多进程通信,这时,可选的方案为: 1. Bundle    :四大组件之间的进程间通信 2. 文件共享   :适合无并发情景 3. Messager : 低并发的一对 ...

  6. <input />文字方框中,字体颜色的变化 要求默认的字体颜色是灰色,当要输入字时,字体是正常的黑色

    <input type="text" name="address" size="60" maxlength="60" ...

  7. AutoMapper搬运工之初探AutoMapper

    写在前面 知道AutoMapper很久了,但是一直没有用,最近刚好有个场景需要就用了,果然是利器.看了git上的wiki,发现内容其实wiki上写的很全面了,深入的暂时还没挖掘到.不过和群里的朋友交流 ...

  8. POJ 2774 Long Long Message 后缀数组

    Long Long Message   Description The little cat is majoring in physics in the capital of Byterland. A ...

  9. 虚拟主机Dede程序安装

    1. 在网上下载最新版本DedeCMS 2. 将Dede程序通过FTP上传到主机上的htdocs目录. 3. 在主机控制台将程序解压到根目录. 4. 将解压后的 upload 目录下的文件全部移动到 ...

  10. React的双向绑定

    以前对于双向绑定概念来自于Angular.js,现在我用我感兴趣的react.js来实现这样的方式.有2种方式分析,1:不用插件,2:用插件 (引入react.js操作省略...) 不用插件: 先创建 ...