//@author: yzj Date:2015/07/26
//sourse : http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82603#problem/F
//meaning: 类似找油田,然后判断周长
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXN = 22;
int n, m;
int sx, sy;
bool vis[MAXN][MAXN];
int step[MAXN][MAXN];
char c[MAXN][MAXN];
int ddx[9]={0,1,1,1, 0,-1,-1,-1,0};
int ddy[9]={1,1,0,-1, -1,-1,0,1,0};
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int ans = 0;
typedef pair<int, int> P;
//函数声明
int cal_perimeter(int x, int y);
void bfs()
{
queue<P> que;
while(!que.empty())
{
que.pop();
}
for(int i = 0; i < MAXN; i++)
{
for(int j = 0; j < MAXN; j++)
{
vis[i][j] = false;
step[i][j] = 0;
}
}
que.push(P(sx, sy));
vis[sx][sy] = true;
step[sy][sy] = 0;
if(sx==0)ans++;
if(sx==n-1) ans++;
if(sy==0)ans++;
if(sy == m-1) ans++;
while(! que.empty())
{
P p = que.front();
//if(p.first == ex && p.second == ey) break;//return step[p.first][p.second];
que.pop();
// for(int i = 0; i < 8; i++)
// {
for(int i= -1; i <= 1; i++)
{
for(int j = -1; j <= 1; j++)
{
int nx = p.first + i, ny = p.second + j;
if(0<=nx&&nx<n&&0<=ny&&ny<m&&!vis[nx][ny]&&c[nx][ny]=='X')
{
if(nx==0)ans++;
if(nx==n-1) ans++;
if(ny==0)ans++;
if(ny == m-1) ans++;
ans+=cal_perimeter(nx, ny);
//cout << nx << "_" << ny << "-->" << cal_perimeter(nx, ny)<< "_" << ans << endl;
que.push(P(nx, ny));
vis[nx][ny] = true;
step[nx][ny] = step[p.first][p.second] + 1;
}
}
}
//
// }
}
//cout << "y" << ans << endl;
}
int cal_perimeter(int x, int y)
{
// int tot = 0;
// for(int i = 0; i < 4; i++)
// {
// int nx = x+dx[i], ny = y+dy[i];
// if(c[nx][ny]=='X')
// {
// tot++;
// }
// }
// if(tot == 0) return 4;
// else if(tot == 1) return 3;
// else if(tot == 2) return 2;
// else if(tot == 3) return 1;
// else return 0;
int tot = 0;
for(int i = 0; i < 4; i++)
{
int nx = x+dx[i], ny = y+dy[i];
//这里没判断是否越界,导致查了两个小时的错啊!
if(! (0<=nx&&nx<n&&0<=ny&&ny<m)) continue;
if(c[nx][ny]=='.')
{
tot++;
}
}
return tot;
}
int main()
{
//freopen("f:/yzj/cppCode/input.txt", "r", stdin);
while(~scanf("%d %d %d %d", &n, &m, &sx, &sy))
{
if(n==0&&m==0&&sx==0&&sy==0)break;
getchar();
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
scanf("%c", &c[i][j]);
}
getchar();
}
// for(int i = 0; i < n; i++)
// {
// for(int j = 0; j < m; j++)
// {
// cout << c[i][j];
// }
// cout << endl;
// }
// cout<<endl;
sx-=1;sy-=1;
ans = 0;
bfs();
cout << cal_perimeter(sx, sy) + ans << endl;
}
return 0;
}
POJ 1111----F - 广搜 基础
最新推荐文章于 2021-07-28 16:34:45 发布