E. Crazy Robot
题链
很轻松能发现是bfs
我们肯定是从L出发 然后看他们该点可以去的地方是不是只有一条 并且旁边挨着'+'
但是打完一交发现wa3
3 2
.#
..
L.
发现我们会先扩展L上面那个点
然后之后为了保证时间复杂度就不会再扩展了
但实际上 我们当且仅当一个点变成了‘+’之后
她旁边没有扩展过的点才有可能变成‘+’ 因为我们的必要条件就是旁边必须挨着‘+’才行
这样我们每次变成+才会放进去4个 保证了时间复杂度 并且不会发现上面那种情况了
void solve(){
int n,m;cin>>n>>m;
char a[n+1][m+1];
int x,y=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='L'){
x=i,y=j;
}
}
}
queue<pair<int,int>>q;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
for(int i=0;i<4;i++){
int nx=dx[i]+x,ny=dy[i]+y;
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
q.push({nx,ny});
}
}
while(q.size()){
auto [x,y]=q.front();
q.pop();
if(a[x][y]=='#'||a[x][y]=='L')continue;
int t=0,flag=0;
for(int i=0;i<4;i++){
int nx=dx[i]+x,ny=dy[i]+y;
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
if(a[nx][ny]!='#'){
t++;
}
if(a[nx][ny]=='L'){
flag++;
}
}
}
if(t-flag<=1&&flag){
a[x][y]='L';
for(int i=0;i<4;i++){
int nx=dx[i]+x,ny=dy[i]+y;
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
q.push({nx,ny});
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==x&&j==y)cout<<'L';
else{
if(a[i][j]=='L')cout<<"+";
else cout<<a[i][j];
}
}
cout<<endl;
}
cout<<endl;
}
标签:Educational,int,复杂度,Codeforces,nx,ny,&&,118
From: https://www.cnblogs.com/ycllz/p/17020948.html