1. 程式人生 > >洛谷 P1457 城堡 The Castle\USACO 2.1.1

洛谷 P1457 城堡 The Castle\USACO 2.1.1

玄學之門

題目:

傳送門

分析:

作為 U S A C O USACO 中的 2.1

2.1 的第一題,難度還是十分合格的:)
不知道為什麼洛谷上的難度是提高+,可能主要是由於碼長的問題吧
大體的思路是先通過 d f s dfs 染色,然後列舉牆,求出答案

程式碼:

#include
<cstdio>
#include<iostream> #include<algorithm> #include<cstring> #define LL long long #define fs x[i][j][S]=1 #define fe x[i][j][E]=1 #define fn x[i][j][N]=1 #define fw x[i][j][W]=1 #define ff fs,fe,fn,fw #define srsc freopen("1104.in","r",stdin);freopen("1104.out","w",stdout);
using namespace std; inline LL read() { LL d=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();} return d*f; } const int W=0,N=1,E=2,S=3; int t[2501],x[52][52][4],y[51][51],p[1000],n,m,g=0; void dfs(int i,int j) { if(!(i>0&&i<=m&&j>0&&j<=n)) return; y[i][j]=g; if(!x[i][j][S]&&!y[i+1][j]) t[g]++,fs,x[i+1][j][N]=1,dfs(i+1,j); if(!x[i][j][E]&&!y[i][j+1]) t[g]++,fe,x[i][j+1][W]=1,dfs(i,j+1); if(!x[i][j][N]&&!y[i-1][j]) t[g]++,fn,x[i-1][j][S]=1,dfs(i-1,j); if(!x[i][j][W]&&!y[i][j-1]) t[g]++,fw,x[i][j-1][E]=1,dfs(i,j-1); } int main() { int a; n=read();m=read(); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { a=read(); if(a&8) {a-=8;fs;} if(a&4) {a-=4;fe;} if(a&2) {a-=2;fn;} if(a&1) {a-=1;fw;} } int maxt=0; int i=1,j=1; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) { if(!y[i][j]) { t[++g]=1; y[i][j]=g; dfs(i,j); if(maxt<t[g]) maxt=t[g]; } } printf("%d\n%d\n",g,maxt); maxt=0; int li=0,lj=0,k=0; for(int j=n;j>0;j--) for(int i=1;i<=m;i++) { if(y[i][j+1]!=0&&y[i][j]!=y[i][j+1]&&t[y[i][j]]+t[y[i][j+1]]>=maxt) maxt=t[y[i][j]]+t[y[i][j+1]],li=i,lj=j,k=1; if(y[i-1][j]!=0&&y[i][j]!=y[i-1][j]&&t[y[i][j]]+t[y[i-1][j]]>=maxt) maxt=t[y[i][j]]+t[y[i-1][j]],li=i,lj=j,k=2; } printf("%d\n%d %d ",maxt,li,lj); if(k-1) printf("N"); else printf("E"); return 0; }