2.1.1(extra)
2016-03-25 15:59
183 查看
/* ID:18861501 LANG:C++ TASK:castle */ /*------------------Header Files------------------*/ #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <algorithm> #include <cstdlib> #include <ctype.h> #include <cmath> #include <stack> #include <queue> #include <map> #include <vector> #include <limits.h> using namespace std; /*------------------Definitions-------------------*/ #define LL long long #define PI acos(-1.0) #define INF 0x3F3F3F3F /*---------------------Work-----------------------*/ int m,n,cnt=0; int visit[200][200],a[200][200],b[3000]; //b数组存放每个连通的房间数 bool g[200][200][10]; //三维数组标记也是一个技巧 void flood_fill(int x,int y) //递归flood fill { if(x<0||x>=m||y<0||y>=n||visit[x][y]!=-2) return; //大于号误写成小于号,debug了将近三个小时 visit[x][y]=cnt; //每个连通的房间填充相同的数字,关键是在这里 if(!g[x][y][0]) flood_fill(x-1,y); if(!g[x][y][1]) flood_fill(x,y-1); if(!g[x][y][2]) flood_fill(x+1,y); if(!g[x][y][3]) flood_fill(x,y+1); } void work() { scanf("%d%d",&m,&n); int i,j,k; for(i=0; i<m; i++) for(j=0; j<n; j++) visit[i][j]=-2; for(i=0; i<m; i++) for(j=0; j<n; j++) for(k=0; k<4; k++) g[i][j][k]=false; for(j=0; j<n; j++) //坐标系的逆置需要熟悉 for(i=0; i<m ; i++) { scanf("%d",&a[i][j]); if(a[i][j]&(1<<0)) g[i][j][0]=true; //W if(a[i][j]&(1<<1)) g[i][j][1]=true; //N if(a[i][j]&(1<<2)) g[i][j][2]=true; //E if(a[i][j]&(1<<3)) g[i][j][3]=true; //S } for (i = 0; i < m; i++) for (j = 0; j < n; j++) { if (visit[i][j] == -2) cnt++; flood_fill(i, j); } int maxroom=0; for(i=0; i<m; i++) for(j=0; j<n; j++) b[visit[i][j]]++; for(i=1; i<=cnt; i++) maxroom=max(maxroom,b[i]); printf("%d\n%d\n",cnt,maxroom); int max=0; int x=0,y=0; char z; for(i=0; i<m; i++) //遍历每堵墙 for(j=n-1; j>=0; j--) for(k=0; k<4; k++) if(g[i][j][k]) { switch(k) { case 0: if(b[visit[i][j]]+b[visit[i-1][j]]>max&&visit[i][j]!=visit[i-1][j]) { max=b[visit[i][j]]+b[visit[i-1][j]]; x=i,y=j; z='W'; break; } case 1: if(b[visit[i][j]]+b[visit[i][j-1]]>max&&visit[i][j]!=visit[i][j-1]) { max=b[visit[i][j]]+b[visit[i][j-1]]; x=i,y=j; z='N'; break; } case 2: if(b[visit[i][j]]+b[visit[i+1][j]]>max&&visit[i][j]!=visit[i+1][j]) { max=b[visit[i][j]]+b[visit[i+1][j]]; x=i,y=j; z='E'; break; } case 3: if(b[visit[i][j]+b[visit[i][j+1]]]>max&&visit[i][j]!=visit[i][j+1]) { max=b[visit[i][j]]+b[visit[i][j+1]]; x=i,y=j; z='S'; break; } } } printf("%d\n%d %d %c\n",max,y+1,x+1,z); } /*------------------Main Function------------------*/ int main() { //freopen("test.txt","r",stdin); freopen("castle.out","w",stdout); freopen("castle.in","r",stdin); work(); return 0; }
相关文章推荐
- 第四周项目(5)-递归求奇数积
- 实验一、命令解释程序的编写实验
- C#微信公众平台开发—高级群发接口
- C#比较dynamic和Dictionary性能
- k-Means算法Matlab实现
- ListView里的CheckBox选中后滑动时候选择错位的原因.
- 使用java.nio类库实现的Socket
- 进程间通信--管道
- 海思SDK编译实践 — hi3716cv200es1
- 1.5.1
- 1.5.2(extra)
- [leetcode] 269. Alien Dictionary 解题报告
- 微服务(二)
- 转载 -- iOS数据持久化存储
- JMeter学习(十二)JMeter学习参数化User Defined Variables与User Parameters
- .NET中删除空白字符串的10大方法
- 执行构造的顺序
- jQuery监听文件上传实现进度条效果
- 在 JavaScript 中判断用户是用手机还是电脑打开此网页
- 给定一字符串,将每个单词的字符顺序倒置,单词间的顺序不变。例如:输入字符串“I love you”,输出“I evol uoy”。