前面四筆測資都輸出了123
剩下的輸出的數字大概會多正解3~20
下面是我的程式
#include <bits/stdc++.h>
using namespace std;
bool visited[501][501]={0};
int grid[501][501]={0},M,N,many,q;
bool bfs(int stx,int sty,int steps){
int a,dx[5]={0,0,1,-1},dy[5]={1,-1,0,0},x,y,tx,ty;
queue<pair<pair<int,int>,int>>qu;
qu.push({{stx,sty},0});
visited[stx][sty]=1;
while(!qu.empty()){
auto [pos,stepn]=qu.front();
x=pos.first,y=pos.second;
qu.pop();
if(stepn>=steps)
continue;
for(a=0;a<=3;a++){
tx=x+dx[a];
ty=y+dy[a];
if(tx>=0&&tx<=M-1&&ty>=0&&ty<=N-1&&grid[tx][ty]!=-1&&visited[tx][ty]!=1){
many++;
if(grid[tx][ty]>steps-stepn)
{bfs(tx,ty,grid[tx][ty]);grid[tx][ty]=0;}
else
qu.push({{tx,ty},stepn+1});
visited[tx][ty]=1;
}
}
}
if(many>=q)
return 1;
else
return 0;
}
int main(){
int i,j,starti,startj,low=1,Max=250000,mid;
cin>>M>>N>>q;
for(i=0;i<M;i++){
for(j=0;j<N;j++){
cin>>grid[i][j];
if(grid[i][j]==-2)
{starti=i;startj=j;}
}
}
while(Max>low){
memset(visited,0,sizeof(visited));
many=1;
mid=(low+Max)/2;
if(bfs(starti,startj,mid))
Max=mid;
else
low=mid+1;
}
cout<<low;
return 0;
}