首页 > 代码库 > USACO castle

USACO castle

<pre name="code" class="cpp"><pre>USER: Kevin Samuel [kevin_s1]
TASK: castle
LANG: C++

Compiling...
Compile: OK

Executing...
   Test 1: TEST OK [0.003 secs, 3688 KB]
   Test 2: TEST OK [0.005 secs, 3688 KB]
   Test 3: TEST OK [0.008 secs, 3688 KB]
   Test 4: TEST OK [0.008 secs, 3688 KB]
   Test 5: TEST OK [0.003 secs, 3688 KB]
   Test 6: TEST OK [0.005 secs, 3688 KB]
   Test 7: TEST OK [0.014 secs, 3688 KB]
   Test 8: TEST OK [0.005 secs, 3688 KB]

All tests OK.
<p>Your program ('castle') produced all correct answers!  This is your
submission #4 for this problem.  <strong>Congratulations!</strong></p>

/*
ID:kevin_s1
PROG:castle
LANG:C++
*/

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <cstdlib>
#include <list>
#include <queue>	
#include <cmath>

using namespace std;

#define MAXM 100


//gobal variable====
int M,N;
int direct[4][2] = {{-1, 0},{1, 0},{0, 1},{0, -1}};
//north, south, east, west
int castle[MAXM][MAXM];
int visited[MAXM][MAXM];
int visited2[MAXM][MAXM];
int visited3[MAXM][MAXM];
int hasWall[MAXM][MAXM][4];
int cnt, maxarea;
int _count;
//==================


//function==========

void Dec(){
	for(int i = 1; i <= N; i++){
		for(int j = 1; j <= M; j++){
			int wall = castle[i][j];
			if(wall >= 8){
				hasWall[i][j][1] = 1;
				wall = wall - 8;
			}
			if(wall >= 4){
				hasWall[i][j][2] = 1;
				wall = wall - 4;
			}
			if(wall >= 2){
				hasWall[i][j][0] = 1;
				wall = wall - 2;
			}
			if(wall >= 1){
				hasWall[i][j][3] = 1;
				wall = wall - 1;
			}
		}
	}
}


void DFS(int x, int y, int type){
	if(x < 1 || x > N || y < 1 || y > M)
		return;
	if(visited[x][y] != 0)
		return;
	visited[x][y] = type;
	visited2[x][y] = type;
	_count++;
	if(_count > maxarea){
		maxarea = _count;
	}
	for(int d = 0; d < 4; d++){
		if(hasWall[x][y][d] == 0){
			int xx = x + direct[d][0];
			int yy = y + direct[d][1];
			DFS(xx, yy, type);
		}
	}
	return;
}

void DFS1(int x, int y, int type, int color){
	if(x < 1 || x > N || y < 1 || y > M)
		return;
	if(visited[x][y] != type)
		return;
	if(visited3[x][y] == 1)
		return;
	visited[x][y] = color;
	visited3[x][y] = 1;
	for(int d = 0; d < 4; d++){
		if(hasWall[x][y][d] == 0){
			int xx = x + direct[d][0];
			int yy = y + direct[d][1];
			DFS1(xx, yy, type, color);
		}
	}
	return;
}

void print(){
	for(int i = 1; i <= N; i++){
		for(int j = 1; j <= M; j++){
			cout<<visited[i][j]<<" ";
		}
		cout<<endl;
	}
}

void print2(){
	for(int i = 1; i <= N; i++){
		for(int j = 1; j <= M; j++){
			cout<<visited2[i][j]<<" ";
		}
		cout<<endl;
	}
}
//==================

int main(){
	freopen("castle.in","r",stdin);
	freopen("castle.out","w",stdout);
	cin>>M>>N;
	for(int i = 1; i <= N; i++){
		for(int j = 1; j <= M; j++){
			cin>>castle[i][j];
		}
	}
	memset(hasWall, 0, sizeof(hasWall));
	memset(visited, 0, sizeof(visited));
	memset(visited2, 0, sizeof(visited2));
	memset(visited3, 0, sizeof(visited3));
	Dec();
	cnt = 0;
	maxarea = 0;
	int type = 1;
	for(int i = 1; i <= N; i++){
		for(int j = 1; j <= M; j++){
			if(visited[i][j] == 0){
				_count = 0;
				DFS(i, j, type);
				cnt++;
				DFS1(i, j, type, _count);
				type++;
			}
		}
	}
	cout<<cnt<<endl;
	cout<<maxarea<<endl;
	//print2();
	//print();
	//enum the wall
	int mmaxarea = 0;
	int tx = 0, ty = 0, dir = 0;
	for(int x = 1; x <= N; x++){
		for(int y = M; y >= 1; y--){
			for(int d = 0; d < 4; d++){
				if(hasWall[x][y][d] == 1){
					int xx = x + direct[d][0];
					int yy = y + direct[d][1];
					if(xx >= 1 && xx <= N && yy >= 1 && yy <= M){
						if((visited[x][y] + visited[xx][yy]) > mmaxarea && (visited2[x][y] != visited2[xx][yy])){
							mmaxarea = visited[x][y] + visited[xx][yy];
							tx = x;
							ty = y;
							dir = d;
						}
						if((visited[x][y] + visited[xx][yy]) == mmaxarea && (visited2[x][y] != visited2[xx][yy])){
							if(y < ty){
								tx = x;
								ty = y;
								dir = d;
							}
							if(y == ty && x > tx){
								tx = x;
								ty = y;
								dir = d;
							}
						}
					}
				}
			}
		}
	}
	cout<<mmaxarea<<endl;
	if(dir == 1){
		tx = tx + 1;
		dir = 0;
	}
	if(dir == 3){
		ty = ty - 1;
		dir = 2;
	}
	cout<<tx<<" "<<ty<<" ";
	if(dir == 0)
		cout<<"N"<<endl;
	if(dir == 2)
		cout<<"E"<<endl;
	return 0;
}