您的位置:首页 > 其它

The Castle(USACO 2.1.1)

2015-09-18 13:53 363 查看
图的遍历,注意对边的处理,以及要合理地使用类

#include <iostream>
#include <fstream>
#include <string>
//#define LOCAL
#define MAXN 2510

using namespace std;

#ifdef LOCAL
ofstream fout ("out.txt");
ifstream fin ("in.txt");
#else
ofstream fout ("castle.out");
ifstream fin ("castle.in");
#endif

struct node
{
int key;
int dir[4]; //四个方向的边是否存在

node()
{
for(int i = 0; i < 4; i++)
dir[i] = 0;
key = 2501;
}
};

int have[55][55];
node n[55][55];
int room[2510];
int x_num, y_num;

int dx[] = {-1, 0, 0, 1}; // w s n e
int dy[] = {0, 1, -1, 0};
char d[] = {'W', 'S', 'N', 'E'};
int key[] = {0, 2, 3, 1};

void dfs(int x, int y, int now) // 深搜找相邻
{
//cout <<"4\n";
node &temp = n[x][y];
room[now]++;
have[x][y] = 1;
temp.key = now;
//cout <<"5\n";
for (int i = 0; i < 4; ++i)
{
if(!temp.dir[i])
{
int nx = x + dx[i];
int ny = y + dy[i];
if(nx<0 || nx > MAXN || ny < 0 || ny > MAXN)
continue;
if(!have[nx][ny])
dfs(nx, ny, now);
}
}
//cout <<"6\n";
return;
}

int main() {
fin >> x_num >> y_num;

for (int i = 1; i <= y_num; ++i)
for (int j = 1; j <= x_num; ++j)
{
int temp;
fin >> temp;
int k = 0;
while(temp)
{
if(temp&1)
{
n[j][i].dir[key[k]] = 1; // 1 then, have wall
}
temp >>= 1;
k++;
}
}
//cout << "1\n";
int temp_key = 0;
for(int i = 1; i <= x_num; i++)
for (int j = 1; j <= y_num; ++j)
{
if(!have[i][j])
{
//cout << "3\n";
dfs(i, j, temp_key);
temp_key++;
}
}
//cout << "2\n";
int max1 = -1;
int max2 = -1;
int resx;
int resy;
char resc;
for (int i = 1; i <= x_num; ++i)
{
for (int j = y_num; j >= 1; --j)
{
max1 = max(max1, room[n[i][j].key]);
int temp2;
for(int k = 0; k < 4; k++)
{
if(n[i][j].dir[k]&&(n[i][j].key != n[i+dx[k]][j+dy[k]].key))
{
if(max2 < (room[n[i][j].key] + room[n[i+dx[k]][j+dy[k]].key]))
{
resx = i;
resy = j;
resc = d[k];
max2 = (room[n[i][j].key] + room[n[i+dx[k]][j+dy[k]].key]);
}
}
}
}
}

fout<<temp_key<<'\n'<<max1<<'\n'<<max2<<'\n';
fout<<resy<<' '<<resx<<' '<<resc<<'\n';
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: