思路
这道题,我一开始还以为是数学方法,结果一看数据范围:
The first input line contains two integers
N , M N , M ( 1 < = N , M < = 20001 < = N , M < = 2000 ) N,MN,M ( 1<=N,M<=20001<=N,M<=2000 ) N,MN,M(1<=N,M<=20001<=N,M<=2000)
好吧,BFS 模板题。
前置芝士
BFS
方法,如果您还不会,可以参考这里(应该没人不会吧)
code and 思路详解
分析一下,对于每个着火点,理论上可以扩散出四个着火点,但是由于会超出地图,要加入特判 if(nx<1||nx>n||ny<1||ny>m){continue;}
还有,由于这样会导致一个地方重复烧过好几次导致死循环,所以还要加上
if(vis[nx][ny])continue;
。
为了找出最后一个被烧得地方,我们还需要两个变量。 QaQ=nnx; qAq=nny;
这样,当 q 为空的时候 这两个变量正好就是最后被烧到的。( nnx,nny
是当前的坐标)
最后别忘记文件输入输出。
code:
#include <iostream>
#include<queue>
using namespace std;
int n,m;
bool vis[2002][2002];
const int dx[4]={1,-1,0,0};
const int dy[4]={0,0,1,-1};
queue<int> q;
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
cin>>n>>m;
int k;
cin>>k;
while(k--){
int x,y;
cin>>x>>y;
q.push(x);
q.push(y);
vis[x][y]=1;
}
int QaQ=0,qAq=0;
while(!q.empty()){
int nnx=q.front();
q.pop();
int nny=q.front();
q.pop();
// cout<<nnx<<" "<<nny<<endl;
QaQ=nnx;
qAq=nny;
for(int i=0;i<4;i++){
int nx=nnx+dx[i];
int ny=nny+dy[i];
if(nx<1||nx>n||ny<1||ny>m||vis[nx][ny]){continue;}
vis[nx][ny]=1;
q.push(nx);
q.push(ny);
}
}
cout<<QaQ<<" "<<qAq<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
//
ps:这题貌似还有数学办法?
ps:这题貌似还可以循环做?