简单的观察可以发现数字与墙之间有如下规律:
15-东西南北 14-东南北 13-东西南 12-东南 11-西北南 10-北南
9-西南 8-南 7-东西北 6-东北 5-东西 4-东 3-西北 2-北 1-西
注意:0也是, 就是周围没有墙。
主要是用flood fill,但是有一些细节:重载<的时候,扫描的时候。代码量有点大,不过思维量小,速度也还可以。
/*
ID: awsd1231
PROG: castle
LANG: C++
*/
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct T {
int color;
int value;
T() : color(0) {}//初始化每个color为0
}cas[50][50];
int m, n;
int c[2501] = {0};//统计每种颜色个数
struct T2 {
int s, x, y, turn;//turn 0down 1right
}tmp;
vector<T2> ans;
bool operator < (T2 a, T2 b) {
if(a.x != b.x) return a.x < b.x;
if(a.y != b.y)return a.y > b.y;
return a.turn < b.turn;
}
void floodFill(int x, int y, int color) {
++c[color];
cas[y][x].color = color;
switch (cas[y][x].value) {
case 14 : if (!cas[y][x - 1].color) //left
floodFill(x - 1, y, color);
break;
case 13 : if (!cas[y - 1][x].color) //up
floodFill(x, y - 1, color);
break;
case 12 : if (!cas[y][x - 1].color) //left
floodFill(x - 1, y, color);
if (!cas[y - 1][x].color) //up
floodFill(x, y - 1, color);
break;
case 11 : if (!cas[y][x + 1].color) // right
floodFill(x + 1, y, color);
break;
case 10 : if (!cas[y][x - 1].color) // left
floodFill(x - 1, y, color);
if (!cas[y][x + 1].color) // right
floodFill(x + 1, y, color);
break;
case 9 : if (!cas[y][x + 1].color) // right
floodFill(x + 1, y, color);
if (!cas[y - 1][x].color) // up
floodFill(x, y - 1, color);
break;
case 8 : if (!cas[y][x - 1].color) // left
floodFill(x - 1, y, color);
if (!cas[y][x + 1].color) // right
floodFill(x + 1, y, color);
if (!cas[y - 1][x].color) // up
floodFill(x, y - 1, color);
break;
case 7 : if (!cas[y + 1][x].color) // down
floodFill(x, y + 1, color);
break;
case 6 : if (!cas[y][x - 1].color)// left
floodFill(x - 1, y, color);
if (!cas[y + 1][x].color)//down
floodFill(x, y + 1, color);
break;
case 5 : if (!cas[y - 1][x].color) // up
floodFill(x, y - 1, color);
if (!cas[y + 1][x].color) // down
floodFill(x, y + 1, color);
break;
case 4 : if (!cas[y][x - 1].color) // left
floodFill(x - 1, y, color);
if (!cas[y - 1][x].color) // up
floodFill(x, y - 1, color);
if (!cas[y + 1][x].color) // down
floodFill(x, y + 1, color);
break;
case 3 : if (!cas[y][x + 1].color) // right
floodFill(x + 1, y, color);
if (!cas[y + 1][x].color) // down
floodFill(x, y + 1, color);
break;
case 2 : if (!cas[y][x + 1].color) // right
floodFill(x + 1, y, color);
if (!cas[y][x - 1].color) // left
floodFill(x - 1, y, color);
if (!cas[y + 1][x].color) // down
floodFill(x, y + 1, color);
break;
case 1 : if (!cas[y][x + 1].color) // right
floodFill(x + 1, y, color);
if (!cas[y + 1][x].color) // down
floodFill(x, y + 1, color);
if (!cas[y - 1][x].color) // up
floodFill(x, y - 1, color);
break;
case 0 : if (!cas[y][x + 1].color) // right
floodFill(x + 1, y, color);
if (!cas[y][x - 1].color) // left
floodFill(x - 1, y, color);
if (!cas[y + 1][x].color) // down
floodFill(x, y + 1, color);
if (!cas[y - 1][x].color) // up
floodFill(x, y - 1, color);
break;
}
}
int main() {
freopen("castle.in", "r", stdin);
freopen("castle.out", "w", stdout);
scanf("%d%d", &m, &n);
for (int i = 0; i != n; ++i) {
for (int j = 0; j != m; ++j) {
scanf("%d", &cas[i][j].value);
}
}
int co(0);//赋颜色co
for (int i = 0; i != n; ++i) {
for (int j = 0; j != m; ++j) {
if (cas[i][j].color == 0)
floodFill(j, i, ++co);
}
}
int maxS(0);
for (int i = 0; i != co; ++i) {
if(maxS < c[i + 1]) maxS = c[i + 1];
}
cout << co << endl << maxS << endl;
tmp.s = tmp.x = tmp.y = tmp.turn = -1;
ans.push_back(tmp);//初始化,让ans不为空
for (int i = 0; i != n; ++i) {
for (int j = 0; j != m - 1; ++j) {
if (cas[i][j].color != cas[i][j + 1].color) {
int S = c[cas[i][j].color] + c[cas[i][j + 1].color];
if (S >= ans[0].s) {
tmp.s = S;
tmp.x = j;
tmp.y = i;
tmp.turn = 1;
if (S > ans[0].s) ans.clear();
ans.push_back(tmp);
}
}
}
}
for (int i = n; i != 1; --i) {
for (int j = 0; j != m; ++j) {
if(cas[i][j].color != cas[i - 1][j].color) {
int S = c[cas[i][j].color] + c[cas[i - 1][j].color];
if (S >= ans[0].s) {
tmp.s = S;
tmp.x = j;
tmp.y = i;
tmp.turn = 0;
if (S > ans[0].s) {
ans.clear();
}
ans.push_back(tmp);
}
}//cout << "***" << endl;// 可以执行
}//cout << "**" << endl;
}
cout << ans[0].s << endl;
sort(ans.begin(), ans.end());
cout << ans[0].y + 1 << " " << ans[0].x + 1 << " ";
if(ans[0].turn) cout << "E" << endl;
else cout << "N" << endl;
return 0;
}
时间: 2024-10-15 23:33:24