记录编号 604793 评测结果 A
题目名称 2515.[POJ 2044]天气预报 最终得分 100
用户昵称 Gravatar左清源 是否通过 通过
代码语言 C++ 运行时间 0.173 s
提交时间 2025-08-11 20:22:49 内存使用 151.19 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=370;
int f[N][5][5][9][9][9][9];
int n,a[N][5][5];
int fx[]={0,-1,0,1,0,-2,0,2,0},fy[]={0,0,1,0,-1,0,2,0,-2};
int check(int d,int i,int j){
	return (a[d][i][j]|a[d][i+1][j]|a[d][i][j+1]|a[d][i+1][j+1]);
}
int dfs(int day,int x,int y,int f1,int f2,int f3,int f4){
	if(f[day][x][y][f1][f2][f3][f4]!=-1)return f[day][x][y][f1][f2][f3][f4];
	if(check(day,x,y)||f1>=7||f2>=7||f3>=7||f4>=7)return 0;
	if(day==n)return 1;
	int ans=0,g1,g2,g3,g4;
	for(int k=0,xx,yy;k<9;k++){
		xx=x+fx[k],yy=y+fy[k];
		if(xx>=1&&xx<=3&&yy>=1&&yy<=3){
			g1=(xx==1&&yy==1)?0:f1+1;
			g2=(xx==1&&yy==3)?0:f2+1;
			g3=(xx==3&&yy==1)?0:f3+1;
			g4=(xx==3&&yy==3)?0:f4+1;
			ans|=dfs(day+1,xx,yy,g1,g2,g3,g4);
		}
	}
	return f[day][x][y][f1][f2][f3][f4]=ans;
}
void work(){
	for(int d=1;d<=n;d++){
		for(int i=1;i<=4;i++){
			for(int j=1;j<=4;j++){
				a[d][i][j]=0;
			}
		}
	}
	for(int d=1;d<=n;d++){
		for(int i=1;i<=4;i++){
			for(int j=1;j<=4;j++){
				scanf("%d",&a[d][i][j]);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=4;j++){
			for(int k=1;k<=4;k++){
				for(int a=0;a<=7;a++){
					for(int b=0;b<=7;b++){
						for(int c=0;c<=7;c++){
							for(int d=0;d<=7;d++){
								f[i][j][k][a][b][c][d]=-1;
							}
						}
					}
				}
			}
		}
	}
	printf("%d\n",dfs(1,2,2,1,1,1,1));
}
int main(){
	freopen("weather_forecast.in","r",stdin);
	freopen("weather_forecast.out","w",stdout); 
	while(scanf("%d",&n)&&n)work();
	return 0;
}