#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <math.h>
#include <bitset>
using namespace std;
int n,m,d;
char e[1001][1001];
int mark[1001][1001],locrat[1001][1001];
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
while(scanf("%d %d %d",&n,&m,&d)!=EOF)
{
int i,j,k,x,y;
for(i=0;i<n;i++)
scanf("%s",e[i]);
vector<pair<int,int> >rats;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
if(e[i][j]=='R')
rats.push_back(make_pair(i,j)); //用rats记录老鼠的位置
}
if(rats.size()>300) //8秒两个炸弹最多覆盖290个空格
{
printf("-1\n");
continue;
}
vector<pair<int,int> >mm;
memset(locrat,-1,sizeof(locrat));
for(i=0;i<rats.size();i++)
{
for(j=-d;j<=d;j++)
for(k=-d;k<=d;k++)
{
if(abs(j)+abs(k)<=d)
{
x=rats[i].first+j;
y=rats[i].second+k;
if(x>=0&&y>=0&&x<n&&y<m&&e[x][y]!='X')
mm.push_back(make_pair(x,y));
}
}
locrat[rats[i].first][rats[i].second]=i;
}
sort(mm.begin(),mm.end()); //
mm.erase(unique(mm.begin(),mm.end()),mm.end()); //清楚重复
if(mm.size()>1200)//两个炸弹范围不重叠,且范围内全是老鼠,则生成的mm.size()也不会超过1200个
{
printf("-1\n");
continue;
}
vector<bitset<300> >s(mm.size()); //建立一个mm.size()大的数组bitset,每个有300位
memset(mark,-1,sizeof(mark));
pair<int,int>queue[300];
for(i=0;i<mm.size();i++)//枚举所有可能点
{
int start,tail;
start=0;
tail=1;
queue[start]=mm[i];
mark[mm[i].first][mm[i].second]=0;
while(start<tail)
{
if(mark[queue[start].first][queue[start].second]<d)
{
for(j=0;j<4;j++)
{
x=queue[start].first+dir[j][0];
y=queue[start].second+dir[j][1];
if(e[x][y]!='X'&&mark[x][y]==-1)
{
queue[tail++]=make_pair(x,y);
mark[x][y]=mark[queue[start].first][queue[start].second]+1;
}
}
}
start++;
}
s[i].reset(); //全初始化为0
for(j=0;j<tail;j++)
{
x=queue[j].first;
y=queue[j].second;
if(locrat[x][y]!=-1)
s[i].set(locrat[x][y]); //使第locrat[x][y]位为1;
mark[x][y]=-1;
}
}
bitset<300>full;
for(i=0;i<rats.size();i++)
full.set(i); //full里第i位变为1
for(i=0;i<mm.size();i++)
{
for(j=i+1;j<mm.size();j++)
{
if((s[i]|s[j])==full)//判断两个炸弹能否炸光老鼠,即全部位数是否能全为1
{
int x1,y1,x2,y2;
x1=mm[i].first;
y1=mm[i].second;
x2=mm[j].first;
y2=mm[j].second;
printf("%d %d %d %d\n",x1+1,y1+1,x2+1,y2+1);
break;
}
}
if(j<mm.size())
break;
}
if(i>=mm.size())
printf("-1\n");
}
return 0;
}
Codeforces Round #155 (Div. 2) D-rats
最新推荐文章于 2019-06-26 23:26:43 发布