ZOJ - 4020 Traffic Light 【BFS】
题目链接
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4020
题意
给出一张地图  以及起点和终点  求是否能从起点走到终点 如果能 求出最小步数 如果不能 输出 -1 
然后地图上的0表示在这个点 只能 上下走,,1 只能 左右走
没走一步 地图上 每个1 都变成 0 每个0 都变成 1
思路 
那么地图变化 可以用 步数 % 2 来求得  如果 步数 % 2  是 1  那么此时  
1 就是 0  0 就是 1   如果 步数 % 2  是 0  那么就按照原地图来算 
因为 n 或者 m 特别大  所以用 vector  来保存 地图  用一个 pair(int, int) 前者保存地图 后者保存标记
AC代码
#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits>
#define CLR(a) memset(a, 0, sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;
const double PI = acos(-1);
const double E = exp(1);
const double eps = 1e-30;
const int INF = 0x3f3f3f3f;
const int maxn = 1e3 + 5;
const int MOD = 1e9 + 7;
int Move[2][2][2]
{
    -1, 0,
     1, 0,
     0,-1,
     0, 1,
};
vector < vector <pii> > G;
vector <pii> tmp;
int sx, sy, ex, ey;
int ans;
int n, m;
struct Node
{
    int x, y, step;
}temp;
bool ok(int x, int y)
{
    if (x < 0 || x >= n || y < 0 || y >= m)
        return false;
    return true;
}
queue <Node> q;
void bfs()
{
    while (!q.empty())
    {
        int x = q.front().x;
        int y = q.front().y;
        int step = q.front().step;
        q.pop();
        if (x == ex && y == ey)
        {
            ans = step;
            return;
        }
        int d;
        if (step % 2)
            d = !G[x][y].first;
        else
            d = G[x][y].first;
        for (int i = 0; i < 2; i++)
        {
            temp.x = x + Move[d][i][0];
            temp.y = y + Move[d][i][1];
            if (ok(temp.x, temp.y) && G[temp.x][temp.y].second == 0)
            {
                temp.step = step + 1;
                q.push(temp);
                G[temp.x][temp.y].second = 1;
            }
        }
    }
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        G.clear();
        int num;
        scanf("%d%d", &n, &m);
        for (int i = 0; i < n; i++)
        {
            tmp.clear();
            for (int j = 0; j < m; j++)
            {
                scanf("%d", &num);
                tmp.pb(pii(num, 0));
            }
            G.pb(tmp);
        }
        scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
        sx--, sy--, ex--, ey--;
        while (!q.empty())
            q.pop();
        temp.x = sx;
        temp.y = sy;
        temp.step = 0;
        q.push(temp);
        ans = -1;
        bfs();
        cout << ans << endl;
    }
}ZOJ - 4020 Traffic Light 【BFS】的更多相关文章
- ZOJ - 4020  Traffic Light (BFS)
		[传送门]http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4020 [题目大意]从起点(sx, sy)出发,要到达(ex , ... 
- [ZOJ 4020] Traffic Light
		题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4020 很简单的一个bfs题,是我想多了. 顺便学习一下C++的S ... 
- 【bfs】抓住那头牛
		[题目] 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0≤N≤100000),牛位于点K(0≤K≤100000).农夫有两种移动方式: 1.从X移动到X-1或X+1,每次 ... 
- 【bfs】拯救少林神棍(poj1011)
		Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ... 
- 【bfs】Knight Moves
		[题目描述] 输入nn代表有个n×nn×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步. [输入] 首先输入一个nn,表示测试样例 ... 
- 【bfs】1252 走迷宫
		[题目描述] 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ... 
- 【bfs】献给阿尔吉侬的花束
		[题目描述] 阿尔吉侬是一只聪明又慵懒的小白鼠,它最擅长的就是走各种各样的迷宫.今天它要挑战一个非常大的迷宫,研究员们为了鼓励阿尔吉侬尽快到达终点,就在终点放了一块阿尔吉侬最喜欢的奶酪.现在研究员们想 ... 
- 【bfs】迷宫问题
		[题目描述] 定义一个二维数组: int maze[5][5] = { 0,1,0,0,0, 0,1,0,1,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,1,0, }; 它表示一个迷 ... 
- 【bfs】仙岛求药
		[题目描述] 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由M×N个方格组成,有的 ... 
随机推荐
- dedecms让channelartlist标签支持currentstyle属性方
			把dedecms中用channelartlist当导航的站很普遍,但是有的站需要用到当前页中导航样,就是随着不同的页面,导航样式也随着变化. 首先打开include\taglib\channelart ... 
- linux中xargs用法
			参数代换: xargs xargs 是在做什么的呢?就以字面上的意义来看, x 是加减乘除的乘号,args 则是 arguments (参数) 的意思,所以说,这个玩意儿就是在产生某个命令的参数的意思 ... 
- ichartjs 制作的图表
			ichartjs资源包下载:https://files.cnblogs.com/files/xiandedanteng/ichartjs-ichartjs1.2.zip 本例下载地址:https:// ... 
- Libimseti推荐系统
			技术:easyUI.jQuery.Spring.Struts.Hibernate.Mahout.MySQL 本Libimseti推荐系统使用数据.代码參考<Mahout in action> ... 
- php中session的理解
			一.Session是什么 Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待session,它有着类似但不完全同样的含义.比方,在web应用的用户看来,他打开浏 ... 
- x86 Android游戏开发专题篇之使用google breakpad捕捉c++崩溃(以cocos2dx为例)
			近期一直都在x86设备上进行游戏开发.就c++层和Android java层倒没有什么要特别注意的(除了须要注意一下改动Application.mk指定平台外),在c++崩溃的时候,非常多时候看不到堆 ... 
- shell循环,判断介绍,以及实例
			shell的循环主要有3种,for,while,until shell的分支判断主要有2种,if,case 一,for循环 #!/bin/bash for file in $(ls /tmp/test ... 
- 【转载】aspx,ascx和ashx使用小结
			做asp.net开发的对.aspx,.ascx和.ashx都不会陌生.关于它们,网上有很多文章介绍."纸上得来终觉浅,绝知此事要躬行",下面自己总结一下做个笔记.1..aspxWe ... 
- 朴素贝叶斯分类算法-----java
			1.贝叶斯分类的基础--贝叶斯定理 已知某条件概率.怎样得到两个事件交换后的概率,也就是在已知P(A|B)的情况下怎样求得P(B|A). 这里先解释什么是条件概率: 表示事件B已经发生的前提下,事件A ... 
- MySQL系列:innodb源代码分析之线程并发同步机制
			innodb是一个多线程并发的存储引擎,内部的读写都是用多线程来实现的,所以innodb内部实现了一个比較高效的并发同步机制. innodb并没有直接使用系统提供的锁(latch)同步结构,而是对其进 ... 
