acgo题库
  • 首页
  • 题库
  • 学习
  • 天梯
  • 备赛

    竞赛

    • CSP-J/S
    • 蓝桥杯

    考级

    • GESP
    • CPA
    • 电子学会考级
  • 资讯
  • 竞赛
  • 讨论
  • 团队
  • 商城
登录
注册
题目详情提交记录(0)
  • 枚举每个可以换杂物的点

    此题要枚举所有可以换成杂物的位置;为了减少时间复杂度,可以先把这个位置存起来; 对于每个更换的点,算算,使周边可以开垦的地点,变成不能开肯的点,最多的几个; #include<bits/stdc++.h> using namespace std; int n,m,ans=0,dx[5]={0,0,0,1,-1},dy[5]={0,1,-1,0,0},ma; char c[1005][1005]; queue<pair<int,int>>q; bool fuhe(int x,int y){ if(c[x][y+1]'#'||c[x+1][y]'#'||c[x][y-1]'#'||c[x-1][y]'#')return false; else return true; } void f(){ int t=q.size(); int cnt=0; while(t--){ int x=q.front().first,y=q.front().second; q.pop(); c[x][y]='.'; cnt=0; for(int i=0;i<=4;i++){//更换每个杂物,看否让周边开垦数量减少 int xx=x+dx[i],yy=y+dy[i]; if(c[xx][yy]'.'&&fuhe(xx,yy))cnt++; } ma=max(ma,cnt); //求数减少的最大量; } } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>c[i][j]; if(c[i][j]'.')q.push({i,j});//记录每个可以加杂物的点; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(c[i][j]=='.'){ if(fuhe(i,j)){ ans++;//查出总数; } } } } f(); cout<<ans-ma; return 0; }

    userId_undefined
    华英雄
    时间刺客快乐小狗秩序白银分支·分支解题者
    1阅读
    0回复
    0点赞
暂无数据

提交答案之后,这里将显示提交结果~

首页