题意:每个点有两种状态,0/1,0表示只能上下方向走,1表示只能左右方向走。每走一步整个图的状态改变一次(即0->1,1->0)。

数据范围:n,m<=1e15

开始迷之因为数组太大编译不过(但是有的人过了就不是很懂orz)。强制状态压缩,将map用vector存储。然后对于每个点奇数次访问用2标记,偶数次访问用4标记。

利用int是8字节的特点,最后一位记录map,前面两位记录访问状态。

若奇数次访问过后,map[i][j] |= 2;若偶数次访问过后,map[i][j] |= 4。

这种状压真的强势。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#define maxn 100005
using namespace std;
const int change[]={-,};
struct point{
int x,y;
int time;
}sstart;
int n,m;
int x1,x2,y11,y2;
vector<int>map[maxn];
int check(point tmp){
if (tmp.x< || tmp.x>=n || tmp.y< || tmp.y>=m) return ;
else return ;
}
int bfs(){
queue<point> Q;
sstart.x=x1;sstart.y=y11;sstart.time=;map[x1][y11]|=;
Q.push(sstart);
while (!Q.empty()){
point pre=Q.front();
Q.pop();
if (pre.x==x2 && pre.y==y2) return pre.time;
if (pre.time%==){
if (!(map[pre.x][pre.y]&)){ //上下
for (int i=;i<;i++){
point next;
next.x=pre.x+change[i];
next.y=pre.y;
next.time=pre.time+;
if (check(next) && !((int)map[next.x][next.y]&)){
Q.push(next);
map[next.x][next.y]|=;
}
}
}
if (map[pre.x][pre.y]&){ //左右
for (int i=;i<;i++){
point next;
next.x=pre.x;
next.y=pre.y+change[i];
next.time=pre.time+;
if (check(next) && !((int)map[next.x][next.y]&)){
Q.push(next);
map[next.x][next.y]|=;
}
}
}
}
else{
if (!(map[pre.x][pre.y]&)){ //左右
for (int i=;i<;i++){
point next;
next.x=pre.x;
next.y=pre.y+change[i];
next.time=pre.time+;
if (check(next) && !((int)map[next.x][next.y]&)){
Q.push(next);
map[next.x][next.y]|=;
}
}
}
if (map[pre.x][pre.y]&){ //上下
for (int i=;i<;i++){
point next;
next.x=pre.x+change[i];
next.y=pre.y;
next.time=pre.time+;
if (check(next) && !((int)map[next.x][next.y]&)){
Q.push(next);
map[next.x][next.y]|=;
}
}
}
}
}
return -;
}
int main(){
int t;
char xx;
cin >> t;
while (t--){
cin >> n >> m;
for (int i=;i<n;i++) map[i].clear();
for (int i=;i<n;i++){
for (int j=;j<m;j++){
cin >> xx;
map[i].push_back(xx);
}
getchar();
}
cin >> x1 >> y11 >> x2 >> y2;
x1--;y11--;x2--;y2--;
int ans;
ans=bfs();
cout << ans << endl;
}
return ;
}

最新文章

  1. jQuery设置元素attribute之特殊属性
  2. 设计模式之美:Extension Object(扩展对象)
  3. C语言中可变参数函数实现原理
  4. JAVA8 十大新特性详解
  5. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition)
  6. OpenStack Hacker养成指南
  7. JAVA计算器算法实现
  8. wpa_supplicant wpa_cli 的使用说明
  9. Python中的浅拷贝与深拷贝
  10. Django models 的字段类型
  11. EmWin 接触---基础函数
  12. Leetcode 1012. 十进制整数的反码
  13. 【JVM】2、JVM调优总结
  14. golang总结-Redis整合
  15. Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
  16. vue-keep-alive
  17. 转: android 实现效果特效
  18. Linux vim常用选项
  19. TCP/IP网络编程之地址族与数据序列
  20. dstat工具使用介绍

热门文章

  1. mysql contact_ws函数 字符串被截断问题
  2. PAT 1074 宇宙无敌加法器(20)(代码+思路+测试点分析)
  3. 继续修改爬虫百度贴吧,这次随意贴吧的任何一个index页都行,然后自动d盘生成tupian文件夹来保存
  4. 分组取前N记录
  5. [转载红鱼儿]delphi 实现微信开发(1)
  6. HDU 1040 As Easy As A+B (排序。。。水题)
  7. 判断Mouse事件源类型
  8. Android线程和线程Handler基础一览
  9. java反射中的动态代理机制(有实例)
  10. Oracle SQL Trace 和 10046 事件