POJ2044 Weather Forecast 题解
2024-09-24 12:27:00
写了一个小时……不会……无耻地看题解去了……
关键在于存储状态的方式,真没想到……
每个状态要存当前坐标、天数和这个状态下四个角的情况,vis
数组存整张图的访问情况,有天数、坐标、四个角的情况,只有这样才能保证唯一性。
还没见过这么毒瘤的状态记录题,我还是太 naive 了……
代码要多学习一个
#include <bits/stdc++.h>
using namespace std;
const int dx[9]={0,-1,-2,1,2,0,0,0,0};
const int dy[9]={0,0,0,0,0,-1,-2,1,2};
struct Node{int day,x,y,s[4];};
int n;
bool a[366][4][4],vis[366][4][4][7][7][7][7];
inline bool check(int x,int y,int day,int d[])
{
if(x<0||y<0||x>2||y>2) return 0;
for(int i=0;i<=1;++i)
for(int j=0;j<=1;++j)
if(a[day][x+i][y+j]) return 0;
if(d[0]>=7||d[1]>=7||d[2]>=7||d[3]>=7) return 0;
return 1;
}
bool bfs()
{
if(a[1][1][1]||a[1][1][2]||a[1][2][1]||a[1][2][2]) return 0;
queue<Node> q; memset(vis,0,sizeof(vis));
int sd[4];
q.push((Node){1,1,1,{1,1,1,1}});
vis[1][1][1][1][1][1][1]=1;
while(!q.empty())
{
Node now=q.front(); q.pop();
if(now.day==n) return 1;
for(int i=0;i<9;++i)
{
int x=now.x+dx[i],y=now.y+dy[i];
for(int j=0;j<4;++j) sd[j]=now.s[j]+1;
if(x==0&&y==0) sd[0]=0;
if(x==0&&y==2) sd[1]=0;
if(x==2&&y==0) sd[2]=0;
if(x==2&&y==2) sd[3]=0;
if(check(x,y,now.day+1,sd)&&\
!vis[now.day+1][x][y][sd[0]][sd[1]][sd[2]][sd[3]])
{
q.push((Node){now.day+1,x,y,{sd[0],sd[1],sd[2],sd[3]}});
vis[now.day+1][x][y][sd[0]][sd[1]][sd[2]][sd[3]]=1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;++i)
for(int j=0;j<4;++j)
for(int k=0;k<4;++k)
scanf("%d",&a[i][j][k]);
printf("%d\n",bfs());
}
return 0;
}
最新文章
- 1、Spring In Action 4th笔记(1)
- 指定线程执行的顺序---join()
- 2.11 2D平面最近点对问题[closest pair problem]
- const型类成员
- 蓝牙 GameKit
- list的三种遍历方法
- CLR via C# - GC
- 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)
- HDU - 1205 I NEED A OFFER!
- 第35篇 IIS执行原理
- 高通ASOC中的codec驱动
- U盘中的快捷方式解析
- HDU--1540 Tunnel Warfare(线段树区间更新)
- Linux学习之文件属性chattr权限与sudo权限(十二)
- 第三部分:Android 应用程序接口指南---第二节:UI---第七章 通知
- CentOS 6 安装配置JDK+tomcat环境
- 远程连接工具PuTTY和MTPuTTY
- Android之上下文context
- 支付宝支付下载对账单bug反馈整理
- java基础易混点