[sjtu oj] 1003 二哥养细菌
题目:https://acm.sjtu.edu.cn/OnlineJudge/problem/1003
蛮典型的搜索题
这里采用的是记忆化的bfs (不是dfs,qwq,我为了省事开头搞了个dfs,直接TLE,解析在代码注释里)
题目条件是一个L*L的地图,其中有三种格子,0-空,1-细菌,2-抗生素,每一步为1的格子向相邻四个格子拓展,问填满所有除抗生素外的格子至少要多少步
解法很容易想出来,读入初始状态时让每一个为1的格子入队,记为(i,j,0)
之后进行常规的 bfs 操作
代码如下
#include<bits/stdc++.h> using namespace std; const int MAXN=105; const int pre[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; //10000 -> 2^14 -> ans<=14 //改成bfs了,之前思路错了,不应该因为省事选择dfs,dfs会采用最极端的方式,从一个起点遍历所有点,加了剪枝也没用) //bfs则是从每个点出发,可用于求最优解) int n; int a[MAXN][MAXN]; int vis[MAXN][MAXN]; struct Condi { int x,y,dep; }; queue<Condi> q; int main() { memset(vis,0x3f,sizeof(vis)); cin>>n; int cnt=n*n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; if(a[i][j]==1) { q.push(Condi{i,j,0}); cnt--; vis[i][j]=0; } if(a[i][j]==2) a[i][j]=-1,vis[i][j]=0,cnt--; } } //cout<<cnt<<endl; while(q.size()) { int x=q.front().x,y=q.front().y,dep=q.front().dep; q.pop(); for(int i=0;i<=3;i++) { int xx=x+pre[i][0],yy=y+pre[i][1]; if(xx<=n&&xx>=1&&yy<=n&&yy>=1&&a[xx][yy]!=-1) { if(vis[xx][yy]<dep+1) continue; if(a[xx][yy]==0) cnt--,a[xx][yy]=1; vis[xx][yy]=dep+1; if(cnt==0) { cout<<dep+1; return 0; } q.push(Condi{xx,yy,dep+1}); } } } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步