程序设计实习上机练习43 至少有多少只恼人的大青蛙?
来源:互联网 发布:中国最大的数据平台 编辑:程序博客网 时间:2024/04/29 00:54
枚举路线即可,加上dfs过程中的剪枝,优化的速度很快
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
int r,c,rnum;
int sum;
int n;
int ma[53][53]={};
int ans=14;
struct point{
int x;
int y;
bool operator<(const point &a)const{
if(a.x==x)
return y<a.y;
return x<a.x;
}
point(){};
}p[702];
struct route{
point start;
int dx;
int dy;
int step;
bool operator<(const route &a)const{
return step>a.step;
};
route(point a,int b,int c,int d){
start=a;
dx=b;
dy=c;
step=d;
};
route(){};
}ro[1000001];
bool inside(int x,int y){
return (1<=x && x<=r && 1<=y && y<=c);
}
int match(point start,int dx,int dy){
if (inside(start.x-dx,start.y-dy))
return 0;
int k;
for (k=0;;k++)
{
if (inside(start.x+k*dx,start.y+k*dy))
{
if (ma[start.x+k*dx][start.y+k*dy]==0)
{
return 0;
}
}
else
break;
}
if(k>2)
return k;
return 0;
}
void dfs(int code,int s,int num){
if(sum==s){
ans=min(ans,num);
return;
}
for(int i=code;i<rnum;++i){
if(num+(sum-s)/ro[i].step>=ans)return;
if(match(ro[i].start,ro[i].dx,ro[i].dy)==0)continue;
for(int x=ro[i].start.x,y=ro[i].start.y;1<=x&&x<=r&&y>=1&&y<=c;x+=ro[i].dx,y+=ro[i].dy)--ma[x][y];
dfs(i,s+ro[i].step,num+1);
for(int x=ro[i].start.x,y=ro[i].start.y;1<=x&&x<=r&&y>=1&&y<=c;x+=ro[i].dx,y+=ro[i].dy)++ma[x][y];
}
return;
}
int main(){
int t;
cin>>t;
while(t--){
rnum=0;
ans=14;
cin>>r>>c;
cin>>n;
sum=0;
for(int i=0;i<n;++i){
cin>>p[i].x>>p[i].y;
int l;
cin>>l;
sum+=l;
ma[p[i].x][p[i].y]=l;
}
sort(p,p+n);
for(int i=0;i<n;++i){
for(int j=i+1;j<n;++j){
int st=match(p[i],p[j].x-p[i].x,p[j].y-p[i].y);
if(st!=0){
ro[rnum++]=route(p[i],p[j].x-p[i].x,p[j].y-p[i].y,st);
}
}
}
sort(ro,ro+rnum);
dfs(0,0,0);
cout<<ans<<endl;
}
}
- 程序设计实习上机练习43 至少有多少只恼人的大青蛙?
- 程序设计实习上机练习43 至少有多少只恼人的大青蛙?(搜索+贪心,至今未解决)
- 期末考试-至少有多少只恼人的大青蛙?(算法基础 第10周)
- OJ 7223 至少有多少只恼人的大青蛙?__深搜
- 【正解】Openjudge 至少有多少只恼人的大青蛙 (dfs 剪枝 好题)
- 程序设计实习2015上机练习43题第40题 潘多拉星球的悬浮公寓(变式遍历地图)
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法
- java 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 一只青蛙一次可以跳上1—n级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?(递归)
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 一只青蛙一次可以跳上1级台阶也可以跳上2级求该青蛙跳上一个n级的台阶总共有多少种跳法
- POJ 1054 恼人的青蛙 [ 枚举+剪枝 ]
- NOI题库1814 恼人的青蛙
- 有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡至少要多少只小白鼠才能在24小时
- java里面的三种下载方式
- C++运算符重载
- BM25原理讲解
- <Path>类
- [Kruscal 二分] BZOJ 2654 tree
- 程序设计实习上机练习43 至少有多少只恼人的大青蛙?
- 深入Java集合源码学习系列:比较HashSet、TreeSet、LinkedHashSet性能
- 考研复习第10弹
- 【脑经急转弯】—— 猜额头上的数字
- 交通工具
- 数据结构
- 路由器RR,PE,P设备
- 数据结构8.广义表
- SQL学习笔记13——事务