您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: