题目吓到我了,看到那么长就不想做了,后来发现挺简单的。。。。
其实就是裸的bfs
给定n*m的矩阵 时刻t L个起点 W个墙
下面给出L个点的坐标
下面每4个数字给出每个墙的起点终点(墙要么平行于轴,要么45°倾斜)
问每个点bfs出去t下后,整个图被遍历了多少点。
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int>pii;
int x,y,t,l,w;
int f[4][2] = {0,1,1,0,0,-1,-1,0};
int a1,a2;
int be1,be2,en1,en2;
int vis[1005][1005];
int ans;
queue<pii>que;
void bfs()
{
while(que.size()>0)
{
pii tmp = que.front();
que.pop();
int a=tmp.first,b=tmp.second;
ans++;
if(vis[a][b]==t) continue;
for(int i=0;i<4;i++)
{
int x1 = a+f[i][0];
int y1 = b+f[i][1];
if(vis[x1][y1]==0&&x1>=1&&x1<=x&&y1>=1&&y1<=y)
{
vis[x1][y1] = vis[a][b]+1;
que.push(make_pair(x1,y1));
}
}
}
}
int main()
{
while(cin>>x)
{
if(x==-1) break;
cin>>y>>t>>l>>w;
memset(vis,0,sizeof(vis));
for(int i=0;i<l;i++)
{
cin>>a1>>a2;
que.push(make_pair(a1,a2));
vis[a1][a2]=1;
}
for(int i=0;i<w;i++)
{
cin>>be1>>be2>>en1>>en2;
if(be1==en1)
{
if(be2<en2)
while(be2<=en2) vis[be1][be2++]=-1;
else
while(be2>=en2)
vis[en1][en2++]=-1;
}
else if(be2==en2)
{
if(be1<en1)
while(be1<=en1) vis[be1++][be2]=-1;
else
while(be1>=en1) vis[en1++][en2]=-1;
}
else
{
if(be1>en1)
{
if(be2>en2)
while(en2<=be2) vis[en1++][en2++]=-1;
else
while(be2<=en2) vis[be1--][be2++]=-1;
}
else
{
if(en2<be2)
while(be2>=en2) vis[be1++][be2--]=-1;
else
while(en2>=be2) vis[be1++][be2++]=-1;
}
}
}
ans=0;
bfs();
cout<<ans<<endl;
}
return 0;
}