POJ2044 天气预报---状态细则
墙角数枝梅,凌寒独自开。
遥知不是雪,为有暗香来。——王安石
题目:天气预报
网址:http://poj.org/problem?id=2044
你是一个可以控制降雨的神仙。
你是一个仁慈的神,希望土地在平时可以有足够的雨水,在赶集和过节能够充满阳光。
你负责掌控一个村子的天气状况。
这个村子呈4 x 4的网格状分布,村子内的每个区域被编号如下图所示:

你拥有一片2 x 2大小的云,这片云不能到村子以外的地方。
你将获得一段时间内村子每个区域的赶集和过节时间表。
在这段时间的第一天,中部地区(6-7-10-11)将会下雨。
在接下来的每一天中,您可以在四个基本方向(东南西北)之中选取一个方向,将云移动1或2个方格,或将其保持在相同位置。
不允许对角线移动。
任何地区都不能连续七天或以上时间都不降雨。
这段时间以外的日子的下雨状况你无需做任何考虑。
输入格式
输入包含多组测试用例。
对于每组测试用例,第一行包含一个整数N,表示这段时间的具体天数。
接下里N行,描绘了接下来N天的赶集和过节时间表,第i行表示第i天的时间表。
这N行里,每行包含16个数字(0或1),0表示正常的一天,1表示赶集和过节的一天,第i个数字表示第i个区域的具体情况。
每行数字之间用空格隔开。
当输入测试用例N=0时,表示输入终止,且该用例无需处理。
输出格式
每个测试用例输出一个整数0或1,如果可以保证整个时间段内,该下雨的地方下雨,不该下的地方不下,则输出1。
如果不能保证则输出0,每个结果占一行。
数据范围
1≤N≤365
输入样例:
1
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
7
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 1 0 0 0 0 1 1 0 0 1
0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1
0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0
0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0
7
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0
0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0
0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1
0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0
1 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0
0
输出样例:
0
1
0
1
这道题其实细节上颇多。
首先,判断每个地区是否连续七天没有浇水,实际上可以通过四个角来判断;
如果定义状态为该云目前的坐标,那么,当四个角中其中有不符题意的状态,难以表示;
如果该状态为坐标以及四个角的情况,那么,对于相同状态下,不同天数所处的情况也不同;
综上,定义:状态(time,(x,y),(d1,d2,d3,d4));
因此,对于这样一个状态,是满足唯一性,也就是说,可以保证该状态可以准确描述状态的情况;
连续七天,因此为了保险起见,我们使用八进制状态压缩(d1,d2,d3,d4),即d1 + d2 * 8 + d3 * 64 + d4 * 512;
其余,就注意细节即可;
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
struct state
{
int turn, pos, code;
state (int x, int y, int z) : turn(x), pos(y), code(z) {}
};
const int dx[10] = {-1, 1, 0, 0, -2, 2, 0, 0}, dy[10] = {0, 0, -1, 1, 0, 0, -2, 2};
bool day[366][17], vis[366][17][4096];
int n;
bool valid(state p)
{
if(vis[p.turn][p.pos][p.code]) return false;
for(int i = 0; i < 4; ++ i)
{
if(p.code % 8 >= 7) return false;
p.code >>= 3;
}
if(day[p.turn][p.pos] || day[p.turn][p.pos + 1] || day[p.turn][p.pos + 4] || day[p.turn][p.pos + 5]) return false;
return true;
}
bool valid(int x, int y)
{
if(x < 0 || x > 2 || y < 0 || y > 2) return false;
//be aware of it : The range is [0, 2] !!
return true;
}
bool bfs()
{
queue <state> Q;
int x, y;
int p[4] = {}, tmp = 0;
while(!Q.empty()) Q.pop();
memset(vis, false, sizeof(vis));
if(!valid(state(1, 6, 1 + 8 + 64 + 512))) return false;
vis[1][6][1 + 8 + 64 + 512] = true;
Q.push(state(1, 6, 1 + 8 + 64 + 512));
// The coodinate must be transfered into this form (x,y) to avoid mistakes about position!!
while(!Q.empty())
{
state now = Q.front(); Q.pop();
tmp = now.code;
for(int i = 0; i < 4; ++ i)
{
p[i] = tmp % 8;
tmp >>= 3;
}
x = (now.pos - 1) / 4, y = (now.pos - 1) % 4;
for(int i = 0; i < 9; ++ i)
{
state next = state(now.turn + 1, (x + dx[i]) * 4 + y + 1 + dy[i], 0);
if(!valid(x + dx[i], y + dy[i])) continue;
switch(next.pos)
{
case 1:
{
next.code = (p[1] + 1) * 8 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
break;
}
case 3:
{
next.code = p[0] + 1 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
break;
}
case 9:
{
next.code = p[0] + 1 + (p[1] + 1) * 8 + (1 + p[3]) * 512;
break;
}
case 11:
{
next.code = p[0] + 1 + (p[1] + 1) * 8 + (1 + p[2]) * 64;
break;
}
default:
{
next.code = p[0] + 1 + (p[1] + 1) * 8 + (p[2] + 1) * 64 + (1 + p[3]) * 512;
break;
}
}
if(!valid(next)) continue;
if(next.turn == n)return true;
vis[next.turn][next.pos][next.code] = true;
Q.push(next);
}
}
return false;
}
int main()
{
while(scanf("%d", &n) == 1)
{
if(!n) return 0;
memset(day, false, sizeof(day));
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= 16; ++ j) scanf("%d", &day[i][j]);
printf("%d\n", bfs());
}
return 0;
}/*
challenge : 1. the design of state
2. the extention of states
3. the pictures of position
*/
POJ2044 天气预报---状态细则的更多相关文章
- 天气预报API(三):免费接口测试(“旧编码”)
说明 我以参考文章为引子,自己测试并扩展,努力寻找更多的气象API... 本文所有测试均以青岛为例. 本文所列接口城市代码(cityid)参数都使用的 "旧编码": 全国城市代码列 ...
- 基于JAVA的全国天气预报接口调用示例
step1:选择本文所示例的接口"全国天气预报接口" url:https://www.juhe.cn/docs/api/id/39/aid/87step2:每个接口都需要传入一个参 ...
- [ActionScript 3.0] AS3调用百度天气预报查询API
接口说明 根据经纬度/城市名查询天气的结果 接口示例 http://api.map.baidu.com/telematics/v3/weather?location=成都&output=jso ...
- 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
转自:http://www.iamsevent.com/post/36.html AS3 Coder]任务七:初涉PureMVC——天气预报功能实现 使用框架:AS3任务描述:了解PureMVC框架使 ...
- 毕业设计--天气预报App
9月中旬,开始动手做我的毕业设计了,之前一直在纠结做啥,后来想想,既然是做毕业设计,那就大胆地做点自己没接触过的东西吧.然后网上查找资料得知做天气预报需要用到开放的API,而且要用那种现在还在维护的, ...
- JTable常见用法细则+设置某列可编辑+滚动表格
JTable常见用法细则 JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处. 一.创建表格控件的各种方式: 1) 调用无参构造函数. JTa ...
- 天气类API调用的代码示例合集:全国天气预报、实时空气质量数据查询、PM2.5空气质量指数等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 全国天气预报:数据来自国家气象局,可根据地名.经纬度GPS.IP查 ...
- Android通过聚合数据API实现天气预报
使用聚合数据的API 聚合数据地址:https://www.juhe.cn/ 在数据服务->生活常用->全国天气预报,申请天气预报的API使用的KEY 保存请求示例的地址,把您申请的KEY ...
- [Android] 免费天气预报接口
[Android] 免费天气预报接口 这是 国家气象局提供的天气预报接口 [免费] 当然,网上有很多的收费API或者每天定次数的接口 使用 国家气象局 的步骤如下: 1.首先获取城市ID号 北京:10 ...
随机推荐
- JS事件之onmouseover 、onmouseout 与onmouseenter 、onmouseleave区别
疫情过后回武汉的第一天打卡,今天偶然遇到一个问题onmouseover .onmouseout 与onmouseenter .onmouseleave这些事件的区别,也看了一些博客,感觉不是很清楚,所 ...
- C 对抗赛
时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,256m 问题描述 某校有n只信竞队伍,队伍编号1到n,每只队伍都有一定数量的队员,队伍中每个人都有一个CF积分,积分越高,意 ...
- MapReduce( map的使用)
MapReduce Description MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算.概念"Map(映射)"和"Red ...
- MySQL(Linux)编码问题——网站刚刚上线就被光速打脸
MySQL(Linux)编码问题--刚刚上线就被光速打脸 MySql默认编码问题 总结了一下,大致是这样的 修改数据库配置 在URL上加载参数 MySql默认编码问题 说到这里真的想哭,改了无数bug ...
- Pointer Lock API(3/3):一个Demo
简单的Demo演练 点击跳转至Code Pen以查看演示和源码 完整代码 <!DOCTYPE HTML> <html lang="en-US"> <h ...
- 虚拟机的vmnet8网卡找不到了
不知道我设置了什么,在我于Linux中配置网络时发现怎么都不行,检查了一下发现用于NAT的网卡没有了. 我重启了电脑之后发现还是没有. 于是按照网上的办法在虚拟网络编辑器将其重置,如下图. 问题解决. ...
- Android 圆形图片库 CircleImageView
高仿微信朋友圈 10s 视频裁剪 引语 晚上好,我是猫咪,我的公众号「程序媛猫咪」会推荐 GitHub 上好玩的项目,挖掘开源的价值,欢迎关注我. <Android 图片裁剪库 uCrop> ...
- CVPR2020文章汇总 | 点云处理、三维重建、姿态估计、SLAM、3D数据集等(12篇)
作者:Tom Hardy Date:2020-04-15 来源:CVPR2020文章汇总 | 点云处理.三维重建.姿态估计.SLAM.3D数据集等(12篇) 1.PVN3D: A Deep Point ...
- 数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法
算法复杂度主方法 有时候,我们要评估一个算法的复杂度,但是算法被分散为几个递归的子问题,这样评估起来很难,有一个数学公式可以很快地评估出来. 一.复杂度主方法 主方法,也可以叫主定理.对于那些用分治法 ...
- pinpoint php 使用不当引发棘手的问题 --psid sid tid pname ptype ah
Pinpoint 简单介绍 Pinpoint 是用 Java 编写的 APM(应用性能管理)工具,用于大规模分布式系统,以帮助分析系统的总体结构以及分布式应用程序的组件之间是如何进行数据互联的. 安装 ...