//usaco training-the castle /* * 题目类型:dfs * 将不同的房间通过深搜标记不同的num,并记录每个房间的大小 * 枚举每一堵墙,记录撤销该墙后的房间大小并更新最大值 * !!! 枚举墙的顺序,先列后行,自左下至右上遍历 * 墙: * left 1、3、5、9、7、11、13、15 * right 4、5、6、12、7、13、14、15 * down 8、9、10、12、11、13、14、15 * up 2、3、6、10、7、11、14、15 / /* Compiling... Compile: OK Executing... Test 1: TEST OK [0.000 secs, 3060 KB] Test 2: TEST OK [0.000 secs, 3060 KB] Test 3: TEST OK [0.000 secs, 3060 KB] Test 4: TEST OK [0.000 secs, 3060 KB] Test 5: TEST OK [0.000 secs, 3060 KB] Test 6: TEST OK [0.000 secs, 3060 KB] Test 7: TEST OK [0.000 secs, 3060 KB] Test 8: TEST OK [0.000 secs, 3060 KB] All tests OK. */ #include <iostream> #include <fstream> #include <algorithm> using namespace std; #define MAX 52 int vis[MAX][MAX],a[MAX][MAX],cnt[MAX*MAX]; int N,M,num,maxn1,maxn2,maxx,maxy; void dfs(int x,int y) { if(x>=0 && y-1>=0 && (a[x][y]!=1&&a[x][y]!=3&&a[x][y]!=5&&a[x][y]!=7 &&a[x][y]!=9&&a[x][y]!=11&&a[x][y]!=13&&a[x][y]!=15) && !vis[x][y-1]){ vis[x][y-1]=num; cnt[num]++; dfs(x,y-1); } if(x>=0 && y+1<M && (a[x][y]!=4&&a[x][y]!=5&&a[x][y]!=6&&a[x][y]!=7 &&a[x][y]!=12&&a[x][y]!=13&&a[x][y]!=14&&a[x][y]!=15) && !vis[x][y+1]){ vis[x][y+1]=num; cnt[num]++; dfs(x,y+1); } if(x+1<N && y>=0 && (a[x][y]!=8&&a[x][y]!=9&&a[x][y]!=10&&a[x][y]!=11 &&a[x][y]!=12&&a[x][y]!=13&&a[x][y]!=14&&a[x][y]!=15) && !vis[x+1][y]){ vis[x+1][y]=num; cnt[num]++; dfs(x+1,y); } if(x-1>=0 && y>=0 && (a[x][y]!=2&&a[x][y]!=3&&a[x][y]!=6&&a[x][y]!=7 &&a[x][y]!=10&&a[x][y]!=11&&a[x][y]!=14&&a[x][y]!=15) && !vis[x-1][y]){ vis[x-1][y]=num; cnt[num]++; dfs(x-1,y); } } int main(void) { int i,j; char ch; ifstream fin("castle.in"); ofstream fout("castle.out"); fin>>M>>N; for(i=0; i!=N; ++i) for(j=0; j!=M; ++j) fin>>a[i][j]; fill(cnt,cnt+50*50,1); for(i=0; i!=N; ++i) for(j=0; j!=M; ++j) if(!vis[i][j]){ vis[i][j]=++num; dfs(i,j); maxn1=max(maxn1,cnt[num]); } for(j=0; j!=M; ++j) for(i=N-1; i>=0; --i){ if(i!=0 && !(a[i][j]!=2&&a[i][j]!=3&&a[i][j]!=6&&a[i][j]!=7&&a[i][j]!=10&&a[i][j]!=11&&a[i][j]!=14&&a[i][j]!=15) && vis[i][j]!=vis[i-1][j] && cnt[vis[i][j]]+cnt[vis[i-1][j]]>maxn2){ ch='N'; maxx=i; maxy=j; maxn2=cnt[vis[i][j]]+cnt[vis[i-1][j]]; } if(j!=M-1 && !(a[i][j]!=4&&a[i][j]!=5&&a[i][j]!=6&&a[i][j]!=7&&a[i][j]!=12&&a[i][j]!=13&&a[i][j]!=14&&a[i][j]!=15) && vis[i][j]!=vis[i][j+1] && cnt[vis[i][j]]+cnt[vis[i][j+1]]>maxn2){ ch='E'; maxx=i; maxy=j; maxn2=cnt[vis[i][j]]+cnt[vis[i][j+1]]; } } fout<<num<<endl<<maxn1<<endl<<maxn2<<endl<<maxx+1<<' '<<maxy+1<<' '<<ch<<endl; return 0; }