【题目链接】

http://poj.org/problem?id=2044

【算法】

广度优先搜索

【代码】

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std;
#define MAXN 400
const int dx[] = {,-,-,,,,,,};
const int dy[] = {,,,-,-,,,,}; int i,j,k,n;
int a[MAXN][][];
bool visited[][][MAXN][][][][]; struct info
{
int x,y,day;
int s1,s2,s3,s4;
};
inline bool check(int x,int y,int day,int s1,int s2,int s3,int s4)
{
if (x <= || x > || y <= || y > ) return false;
if (a[day][x][y] == ) return false;
if (a[day][x][y+] == ) return false;
if (a[day][x+][y] == ) return false;
if (a[day][x+][y+] == ) return false;
if (s1 >= || s2 >= || s3 >= || s4 >= ) return false;
return true;
}
inline bool bfs()
{
int i,sa,sb,sc,sd,tx,ty;
queue< info > q;
info cur;
if (a[][][] || a[][][] || a[][][] || a[][][]) return false;
memset(visited,false,sizeof(visited));
while (!q.empty()) q.pop();
q.push((info){,,,,,,});
visited[][][][][][][] = true;
while (!q.empty())
{
cur = q.front();
q.pop();
if (cur.day == n) return true;
for (i = ; i < ; i++)
{
tx = cur.x + dx[i];
ty = cur.y + dy[i];
sa = cur.s1 + ;
sb = cur.s2 + ;
sc = cur.s3 + ;
sd = cur.s4 + ;
if (tx == && ty == ) sa = ;
if (tx == && ty == ) sb = ;
if (tx == && ty == ) sc = ;
if (tx == && ty == ) sd = ;
if (check(tx,ty,cur.day+,sa,sb,sc,sd) && !visited[tx][ty][cur.day+][sa][sb][sc][sd])
{
q.push((info){tx,ty,cur.day+,sa,sb,sc,sd});
visited[tx][ty][cur.day+][sa][sb][sc][sd] = true;
}
}
}
return false;
} int main()
{ while (scanf("%d",&n) != EOF && n)
{
for (i = ; i <= n; i++)
{
for (j = ; j <= ; j++)
{
for (k = ; k <= ; k++)
{
scanf("%d",&a[i][j][k]);
}
}
}
if (bfs()) printf("%d\n",);
else printf("%d\n",);
} return ; }

最新文章

  1. git merge 和 git rebase 小结
  2. 如何自定义Grunt任务
  3. HTML布局篇之双飞翼(圣杯)布局
  4. Make 教程
  5. 一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构-转
  6. 关于php一些数组函数
  7. JAVA问问
  8. puppet案例
  9. linux ssh scp无密码登录
  10. 当升级新版本的时候,从新加载新版本的js的方法
  11. flumeng-kafka-plugin
  12. worklight 中添加时间控件
  13. Android应用程序内部启动Activity过程(startActivity)的源代码分析
  14. iOS 日历控件
  15. Java课程设计-计算器
  16. 通过sort()方法实现升序和降序排列
  17. centos 7 安装mqtt 修改用户名和密码
  18. 使用template
  19. VsCode插件开发之入门示例
  20. WPF 触摸屏小键盘样式

热门文章

  1. VmWare 安装 Centos
  2. android黑科技系列——分析某直播App的协议加密原理以及调用加密方法进行协议参数构造
  3. JavaScript图片轮播,举一反三
  4. window phone 8 开发准备工作(一)
  5. C#遍历/反射 属性/字段
  6. BZOJ 1645: [Usaco2007 Open]City Horizon 城市地平线 扫描线 + 线段树 + 离散化
  7. ffmpeg中关于EAGAIN的理解及非阻塞IO
  8. PAT_A1135#Is It A Red-Black Tree
  9. Ubuntu安装RTX2080显卡驱动
  10. tesuto-Mobius