题目:

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. mui问题

    2016.7.27 1.当你的html不在文件夹的时候 引路径就不要加../   2.当用svn提交代码的时候要先右键项目->版本管理->与资源库同步,查看你的修改的地方和原来部署上去的文 ...

  2. 【python】确保文件写入结束

    今天遇到了个问题: 我在执行如下代码时发现,文件只写了一半.也就是说,当文件量过大时,下面的代码是不能保证文件被正确写入的. fd = open('test.txt','w') fd.write(&q ...

  3. MyEclipse无法删除项目下的文件

    想删除老版本的jar包或文件,却怎么也删不了, 总是提示Problems encountered while deleting resources. Could not delete 后来关闭myec ...

  4. Huffman树实现_详细注释

    //最优二叉树 #include <iostream> #include <iomanip> using namespace std; //定义结点类型 //[weight | ...

  5. 51nod1072(wythoff 博弈)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1072 题意: 中文题诶~ 思路: 博弈套路是有的, 找np局 ...

  6. Oracl基础知识(一)

    概述 Oracle功能繁多,接触Oracle不深,将接触到的基础知识整理下来,以便不时之需.整理的内容主要有Expdp指令实现数据库备份,Impdp指令实现数据库还原,以及用户.表空间的定义.整理的数 ...

  7. Git版本控制管理学习笔记1-介绍

    几乎所有的版本控制工具都是出于同样的目的:开发以及维护开发出来的代码,方便读取代码的历史,记录所有的修改.这里,介绍的是当前在开源社区内非常流行的版本控制工具Git.它是由Linus Torvalds ...

  8. win10中将默认输入法设置为英文

    开始 设置 时间和语言 区域和语言 语言--中文--选项 微软拼音输入法--选项 IME默认模式--英语

  9. 比管理员(administrator)更高权限的TrustedInstaller

    http://www.gezila.com/tutorials/9664.html 什么是TrustedInstaller管理权限 ?好多朋友都在使用Windows7系统.在使用过程中,有些朋友在删除 ...

  10. Java中的void

    转:关于void 学过java的人都知道void的意思是空,是java中的关键字.最初在知道void的时候是public static void main(String[]args){},我记得当初接 ...