problem

Civilization Accepts: 619 Submissions: 2182
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
这是一个回合制游戏,每一回合开始前会进行上一回合的结算。

有一张 n*nn∗n 的棋盘,我们出生在一个初始位置 (x, y)(x,y),现在我们要选择一个位置建设城市。

你的人物每回合可以移动到距离你曼哈顿距离不超过 2 的位置,移动完成后可以选择是否建立城市。

建立城市后,你的人物消失,成为一个人口为 1 的城市,这个人口要下回合才可以工作。如果不移动,直接在 (x,y) 建城,第 1 回合就可以开始工作。

对于城市的每个居民,你可以安排他到距离城市曼哈顿距离小于等于 3 的位置进行工作,此居民可以瞬间到达该位置,每个位置最多安排一个居民,失业的人口不会生产任何食物。

注意,城市位置上必须有一个居民在工作。

结算按照如下顺序:

如果位置 (i, j)(i,j) 上有一个工作居民,则获得 a[i][j]a[i][j] 的食物。
如果当前城市人口为 ii,且食物达到 8*i^28∗i
2
时,你获得一个新的居民,下一回合可以进行操作。
当结算后城市总人口达到 9 游戏结束。

初始食物数量为 0,人口上涨不会导致之前积累的食物消失。输出最少几个回合能让游戏结束。

Input
第一行一个正整数 test(1 \le test \le 10)test(1≤test≤10) 表示数据组数。

对于每组数据,第一行三个正整数 n(2 \le n \le 500), x(1 \le x \le n), y(1 \le y \le n)n(2≤n≤500),x(1≤x≤n),y(1≤y≤n),分别表示棋盘大小和起始位置。

接下来 nn 行,每行 nn 个整数,第 ii 行第 jj 列的整数表示 a[i][j](1 \le a[i][j] \le 3)a[i]j。

Output
对于每组数据,一行一个整数表示答案。

Sample Input
Copy
1
10 9 8
1 2 2 1 2 3 1 1 2 1
2 1 3 3 3 2 3 2 3 1
1 1 3 1 1 3 2 2 1 2
3 1 3 1 3 3 1 3 1 3
3 2 3 1 3 1 2 2 2 1
2 3 2 3 2 2 3 1 2 3
3 1 3 3 2 2 3 2 3 3
1 3 3 2 3 2 2 2 1 1
3 3 1 2 3 2 1 2 1 2
1 1 3 1 3 1 1 1 3 3
Sample Output
39

solution

枚举每个点的位置,记录回合数,直接广搜。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;int n,bx,by,a[1010][1010];
struct NODE{int x, y, step;NODE(int xx,int yy, int ss){x=xx;y=yy;step=ss;}
};
queue<NODE>q;
int vis[1010][1010], tim;int seq[1010],cnt;
int getTime(int x, int y){cnt = 0;for(int i =-3; i<=3;i++){for(int j = -3; j<=3; j++){int xx = x+i, yy = y+j;if(i==0 && j==0)continue;if(xx<1||xx>n||yy<1||yy>n||abs(xx-x)+abs(yy-y)>3)continue;seq[++cnt]=a[xx][yy];}}sort(seq+1,seq+cnt+1,greater<int>());int num=1,roundnum=0,totfood=0,addfood=a[x][y];while(num<9){roundnum++;totfood+=addfood;if(totfood>=8*num*num){num++;addfood+=seq[num-1];}}return roundnum;
}int ans;
void bfs(){while(!q.empty())q.pop();tim++;ans= getTime(bx,by);q.push(NODE(bx,by,0));vis[bx][by] = tim;while(!q.empty()){NODE tmp = q.front(); q.pop();int x = tmp.x, y = tmp.y;if(tmp.step+1+37>=ans)continue;for(int i=-2; i<=2; i++){for(int j=-2; j<=2; j++){int xx=x+i,yy=y+j;if(xx<1||xx>n||yy<1||yy>n||abs(xx-x)+abs(yy-y)>2||vis[xx][yy]==tim)continue;vis[xx][yy]=tim;ans = min(ans,tmp.step+1+getTime(xx,yy));q.push(NODE(xx,yy,tmp.step+1));}}}
}int main(){int T; cin>>T;while(T--){cin>>n>>bx>>by;for(int i = 1; i<=n; i++)for(int j = 1; j <= n; j++)scanf("%d",&a[i][j]);bfs();cout<<ans<<"\n";}return 0;
}

2020 年百度之星·程序设计大赛 - 初赛一 Civilization BFS广搜相关推荐

  1. 2020 年百度之星·程序设计大赛 - 初赛一 GPA DFS深搜

    problem GPA Accepts: 1554 Submissions: 3947 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...

  2. 2020年百度之星·程序设计大赛-初赛一

    Pro.ID 1001 Drink 题解 1002 GPA 题解 1003 Dec 题解 1004 Civilization 1005 Rotate 题解 1006 Matrix 1007 Mosqu ...

  3. 2020 年百度之星·程序设计大赛 - 初赛一 Dec 二维DP,预处理

    problem Dec Accepts: 1284 Submissions: 4572 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...

  4. 2020 年百度之星·程序设计大赛 - 初赛一 Drink

    Problem Description 我们有 nn 种不同的饮料,每种饮料有无限多瓶,第 ii 种饮料一瓶提供 x[i]x[i] 毫升的水分,包含 y[i]y[i] 卡路里. 现在我们需要选择一种饮 ...

  5. 2020 年百度之星程序设计大赛 - 初赛二

    Poker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

  6. 2020 年百度之星·程序设计大赛 - 初赛一题解

    Drink 对于每一种饮料,都可以算出最少需要多少瓶,从而知道最少摄入多少卡路里,从中找个最优值. #include <iostream> #include <cstdio>u ...

  7. 1001. Poker (思维 / 模拟)(2020年百度之星*程序设计大赛-初赛二)

    传送门 思路: 嗐,又是这种模拟题,每次都不长记性看数据范围,非得傻傻的去循环模拟T一次才知道思考.呜呜呜太菜了. 既然每次至少拿出m,且求的是最多次数,那我们每次就拿m出来. 先将m * p%上取整 ...

  8. 2020年百度之星·程序设计大赛 - 初赛一(前三题)

    文章目录 Drink[贪心] 题目描述 测试样例 解题思路 赛时AC代码 赛后优化AC代码 总结: GPA[枚举] 题目描述 测试样例 解题思路 赛时WA代码 赛时AC代码 总结: Dec[反向dp+ ...

  9. 2020 年百度之星·程序设计大赛 - 初赛三-Discount

    Discount Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

最新文章

  1. 2021-2027年中国手机天线行业竞争格局分析及发展趋势预测报告
  2. android复制链接到粘贴板,Android复制粘贴到剪贴板
  3. git——学习笔记(三)分支管理
  4. 域名服务器的配置文档,dns域名服务器的配置
  5. linux中安装和配置 jdk
  6. Centos7安装dig命令
  7. pta l2-1紧急救援(Dijkstra)
  8. Linux使用docker安装RabbitMQ一站式教程【图文教程】
  9. Dynamics Ax 2012中调用外部web服务
  10. Hadoop学习之web查看HADOOP以及文件的上传和下载
  11. --------溢出植入型木马(后门)的原型实现 作者:FLASHSKY(原创)
  12. InfoPath 教程
  13. 别人在忙挖矿,京东架构师却悄悄用区块链搞了件大事!
  14. 干系人管理4个过程及重点
  15. phpcms 会员头像h5上传_phpcms v9前台会员中心上传头像可getshell及修复
  16. 使用redis list类型解决卡券类奖品发放问题
  17. 多机房UPS及环境集中监控方案丨UPS环境综合监控主机
  18. 被动信息收集(一)nslookup.dig.DNS字典爆破.whois
  19. 一位大学老师写给大学新生的100条肺腑之言
  20. ubuntu18.04 openni2和nite2配置KinectV1(XBOX360)

热门文章

  1. 代码健壮性 —— 异常保护和合法性检测
  2. C++设计模式——从多态到观察者模式到MVC架构
  3. 导盲机器人 英语作文_小米有品推学习平板:小爱AI陪娃学英语,一台陪娃十年成长...
  4. oracle如何判断奇数偶数_图解面试题:如何分析中位数?
  5. python简单爬虫代码-用Python编写一个简单的爬虫
  6. 自学python编程笔记本推荐-这件神器,每个 Python入门学习者都值得一试
  7. python刚出来多少薪资-作为Python程序员,薪资一般是多少?
  8. 编程软件python-零基础学Python编程需要安装什么软件?
  9. python办公自动化案例-用python进行办公自动化都需要学习什么知识呢?
  10. 国内智能语音识别产业的增长,可能源于三大技术突破