记录编号 604799 评测结果 A
题目名称 2515.[POJ 2044]天气预报 最终得分 100
用户昵称 Gravatar会挽弯弓满月 是否通过 通过
代码语言 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;
}