问题解决:【OJ1582】敌人入侵
作者:互联网
题目描述:
有一个城市是宽度为x,高度为y的网格图,(1,1)是左下角的格子。敌人刚开始占领了(sx,sy)格子,每天会攻占8个方向(上下左右,左上左下,右上右下)有人居住的所有格子。1天之后,又可以从这些被攻占的格子攻占其他格子。敌人想知道,多少天可以把该城市有人的地方都被攻占(数据保证都会被攻占)。
城市地图中,"."表示有人居住,而"*"表示没有人居住。
样例如下,这个宽度x=4,高度y=3的地图。
....
..*.
.**.
坐标表示如下(跟平面直角坐标系一样):
(1,3)(2,3)(3,3)(4,3)
(1,2)(2,2)(3,2)(4,2)
(1,1)(2,1)(3,1)(4,1)
如果敌人一开始在左下角(1,1),那么城市将会以如下态势发展:
天数 0 1 2 3 4
敌人会在4天后占领整个城市。
输入:
第一行,四个整数x,y,sx,sy。分别表示城市的宽度,高度,敌人初始位置。
第2到第n+1行,每行有m个字符("."表示有人居住,"*"表示无人居住)。
输出:
一个数,表示多少天城市会被攻占。
样例输入:
4 3 1 1 .... ..*. .**.
样例输出:
4
数据范围:
1<=x,y<=100
以下是代码:
#include<bits/stdc++.h>
using namespace std;
char m[105][105];
int bg[8][2]={{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
int n,k,sx,sy,s;
struct data{
int x,y,s;
data(int x1,int y1,int s1):x(x1),y(y1),s(s1){}
};
queue<data> q;
void f(){
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++)cout<<m[i][j];
cout<<endl;
}
cout<<endl;
}
int main(){
cin>>k>>n>>sy>>sx;
sx=n-sx+1;
for(int i=1;i<=n;i++){
getchar();
for(int j=1;j<=k;j++)cin>>m[i][j];
}
q.push(data(sx,sy,0));
m[sx][sy]='A';
while(!q.empty()){
int x=q.front().x;
int y=q.front().y;
s=q.front().s;
q.pop();
for(int i=0;i<8;i++){
int nx=x+bg[i][0];
int ny=y+bg[i][1];
if(nx>0&&nx<=n&&ny>0&&ny<=k&&m[nx][ny]=='.')
m[nx][ny]='A',q.push(data(nx,ny,s+1));
}
}
cout<<s<<endl;
return 0;
}
如有疑问,可以在下方评论中提出哦~
小编会尽量解决你的问题。
标签:sy,sx,格子,int,OJ1582,front,攻占,入侵,敌人 来源: https://blog.csdn.net/zyl_coder/article/details/122148849