记录编号 |
604799 |
评测结果 |
A |
题目名称 |
2515.[POJ 2044]天气预报 |
最终得分 |
100 |
用户昵称 |
会挽弯弓满月 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.127 s |
提交时间 |
2025-08-11 20:44:01 |
内存使用 |
39.89 MiB |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=370;
int read(){
int x=0,f=1;
char c=getchar();
while(c<48||c>57){
if(x==45) f=-1;
c=getchar();
}
while(c>=48&&c<=57){
x=x*10+c-48;
c=getchar();
}
return f*x;
}
int n;
bool edge(int x,int y){
if(x<1||x+1>4) return 0;
if(y<1||y+1>4) return 0;
return 1;
}
//点(i,j)在第k天有没有活动
int s[5][5][N];
int dx[]={0,0,1,0,-1,0,2,0,-2};
int dy[]={0,-1,0,1,0,-2,0,2,0};
bool check(int x,int y,int day){
if(s[x][y][day]) return 0;
if(s[x+1][y][day]) return 0;
if(s[x][y+1][day]) return 0;
if(s[x+1][y+1][day]) return 0;
return 1;
}
struct node{
int a,b,c,d;
};
bool vis[5][5][N][8][8][8][8];
bool dfs(int x,int y,int day,node w){
if(vis[x][y][day][w.a][w.b][w.c][w.d]) return 0;
if(day-w.a>=7||day-w.b>=7||day-w.c>=7||day-w.d>=7){
vis[x][y][day][w.a][w.b][w.c][w.d]=1;
return 0;
}
if(day>n) return 1;
int tx,ty;
node ts;
for(int i=0;i<=8;i++){
tx=x+dx[i];ty=y+dy[i];
if(!edge(tx,ty)) continue;
if(!check(tx,ty,day+1)) continue;
ts=w;
if(tx==1&&ty==1) ts.a=day+1;
if(tx==1&&ty==3) ts.b=day+1;
if(tx==3&&ty==1) ts.c=day+1;
if(tx==3&&ty==3) ts.d=day+1;
if(dfs(tx,ty,day+1,ts)) return 1;
}
vis[x][y][day][w.a][w.b][w.c][w.d]=1;
return 0;
}
bool flag;
int main(){
freopen("weather_forecast.in","r",stdin);
freopen("weather_forecast.out","w",stdout);
int t;
while(1){
n=read();
if(n==0) break;
memset(s,0,sizeof(s));
memset(vis,0,sizeof(vis));
flag=1;
for(int k=1;k<=n;k++)
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
s[i][j][k]=read();
if(s[2][2][1]||s[2][3][1]||s[3][2][1]||s[3][3][1]){
printf("0\n");
continue;
}
if(dfs(2,2,1,{0,0,0,0})) printf("1\n");
else printf("0\n");
}
return 0;
}