当前位置: 首页 > news >正文

大蒜做营销型网站山东省建设厅职业资格注册中心网站

大蒜做营销型网站,山东省建设厅职业资格注册中心网站,网上购物的商城都有哪些,石家庄做网站百度推广这道题也是很有难度,我最开始尝试用Dijkstra来做,发现不是很好处理,用bfs还不错。 机翻: 1、条件准备 n为鳄鱼数量,jump为跳跃距离,headjump为第一次跳跃距离,包括了岛的半径。 isalive标识…
这道题也是很有难度,我最开始尝试用Dijkstra来做,发现不是很好处理,用bfs还不错。
机翻:

1、条件准备 

n为鳄鱼数量,jump为跳跃距离,headjump为第一次跳跃距离,包括了岛的半径。

isalive标识该鳄鱼是否能到达对岸。

eyu数组存每个鳄鱼的坐标

visit存该鳄鱼是否访问过

lasteyu数组标识跳到该鳄鱼的上一头鳄鱼是哪条

  #include <iostream>#include<vector>#include<string.h>#include<algorithm>#include<stack>using namespace std;#define endl '\n'int n,jump;double headjump;
int isalive[105];
pair<int,int> eyu[105];
int visit[105];
int lasteyu[105];

2、主函数

首先输入数据,headjump为跳跃距离加岛的半径。

令下标为104的鳄鱼为岛屿中心,这里我们令所有坐标都加50,当正数处理。中心就是(50,50)

dis数组是存能第一次跳到的鳄鱼。

循环输入每条鳄鱼信息,坐标都加上50然后存到eyu数组里。

如果该鳄鱼能跳到对岸,则isalive数组标记为1

判断该头鳄鱼是否能第一次跳到,能的话加到dis数组里。

这里注意,我们把鳄鱼据岛中心的距离用codis函数算出来*1000再加上鳄鱼下标i。

这样我们对该数组进行排序,就是按照离岛中心的距离来排序,因为下标的影响很小,不会影响到总体大小。

当我们要用的时候,可以对1000取模来看看是哪头鳄鱼。

注意如果能一步跳出单独判断,然后进入bfs就行了

int main(){std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin>>n>>jump;vector<int> dis;headjump=jump+7.5;eyu[104].first = 50, eyu[104].second = 50;
for(int i=0;i<n;i++){int a, b;cin >> a >> b;a += 50, b += 50;eyu[i].first = a, eyu[i].second = b;if (a <= jump || 100 - a <= jump || b <= jump || 100 - b <= jump)isalive[i] = 1;if(isjump(i,104,headjump))dis.push_back(codis(i,104)*1000+i);}sort(dis.begin(),dis.end());if(jump>=42.5){cout<<'1';return 0;}bfs(dis);return 0;}

3、codis函数

算两头鳄鱼之间的距离并返回,abs是取绝对值函数

int codis(int a,int b)
{int x = abs(eyu[a].first - eyu[b].first);int y = abs(eyu[a].second - eyu[b].second);return x*x+y*y;
}

4、isjump函数

判断两头鳄鱼之间距离是否为dis

bool isjump(int a, int b, double dis)
{if ((double)codis(a,b) <= dis * dis)return 1;return 0;
}

5、bfs函数

代码比较长,我们一点点看。

minjump是存跳的鳄鱼的最少数量,answer栈是存最短路上鳄鱼下标的。

循环遍历dis数组,表示从该头鳄鱼开始跳到岸边的最短路

初始化每一头鳄鱼的上一头鳄鱼为-1,visit数组置0

cur存当前为第几头鳄鱼开始跳,对1000取模即可。

然后用数组模拟队列,tt指队尾,hh指队头

把cur放进队列中,visit置1

layer表示第几步跳到当前鳄鱼,初始为第一步(即cur)

last标记上一步的最后一头鳄鱼,初始为cur因为第一步只能为cur。

遍历队列直到为空,用now取出当前队头是第几头鳄鱼,然后循环判断它能不能跳到其它鳄鱼并且该鳄鱼没有被跳到过,有的话加入队列visit置1,然后该头鳄鱼的上一头鳄鱼为now

如果当前鳄鱼能跳到岸边,并且最短路小于mindist,则更新答案,mindist为layer,answer清空把该最短路上的鳄鱼加进来,即遍历lasteyu数组,直到该鳄鱼没有上一头鳄鱼(为-1),跳出循环。

如果不能跳到岸边,则看看是否更新步数,即当前鳄鱼为上一步所能到达的所有鳄鱼中放入队列的最后一头,更新layer,last更新为队尾。

最后遍历完输出答案,如果mindist没更新输出0,

否则输出步数(鳄鱼头数+1),然后弹出栈里的鳄鱼并输出,此时顺序刚好是对的。

void bfs(vector<int>&dis)
{int minjump=1000; stack<int> answer;//存答案for(int i=0;i<dis.size();i++){memset(lasteyu,-1,sizeof(lasteyu));memset(visit,0,sizeof(visit));int cur=dis[i]%1000;int q[105];int tt=-1,hh=0;visit[cur]=1;q[++tt]=cur;int last=cur;int layer=1;
//从每一个能第一步跳到的鳄鱼开始跳然后判断while(hh<=tt){int now=q[hh++];
//把能跳到的鳄鱼加进队列for(int j=0;j<n;j++){if(!visit[j]&&isjump(now,j,jump)){visit[j]=1;q[++tt]=j;lasteyu[j]=now;}}
//如果跳到该鳄鱼了,并且距离短就更新答案if(isalive[now]&&layer<minjump){minjump=layer;answer=stack<int>();for(;now!=-1;now=lasteyu[now])answer.push(now);break;}
//更新层数,也就是跳的次数if(now==last){last=q[tt];layer++;} }}
//输出答案if(minjump!=1000){cout<<minjump+1<<endl;while(answer.size()){int cur=answer.top();cout<<eyu[cur].first-50<<' '<<eyu[cur].second-50<<endl;answer.pop();}}else cout<<'0';
} 

6、总结

这道题难度比较大,主要很多细节不好处理,比较耗时。

完整代码如下:

  #include <iostream>#include<vector>#include<string.h>#include<algorithm>#include<stack>using namespace std;#define endl '\n'int n,jump;double headjump;
int isalive[105];
pair<int,int> eyu[105];
int visit[105];
int lasteyu[105];int codis(int a,int b)
{int x = abs(eyu[a].first - eyu[b].first);int y = abs(eyu[a].second - eyu[b].second);return x*x+y*y;
}bool isjump(int a, int b, double dis)
{if ((double)codis(a,b) <= dis * dis)return 1;return 0;
}void bfs(vector<int>&dis)
{int minjump=1000; stack<int> answer;for(int i=0;i<dis.size();i++){memset(lasteyu,-1,sizeof(lasteyu));memset(visit,0,sizeof(visit));int cur=dis[i]%1000;int q[105];int tt=-1,hh=0;visit[cur]=1;q[++tt]=cur;int last=cur;int layer=1;while(hh<=tt){int now=q[hh++];for(int j=0;j<n;j++){if(!visit[j]&&isjump(now,j,jump)){visit[j]=1;q[++tt]=j;lasteyu[j]=now;}}if(isalive[now]&&layer<minjump){minjump=layer;answer=stack<int>();for(;now!=-1;now=lasteyu[now])answer.push(now);break;}if(now==last){last=q[tt];layer++;} }}if(minjump!=1000){cout<<minjump+1<<endl;while(answer.size()){int cur=answer.top();cout<<eyu[cur].first-50<<' '<<eyu[cur].second-50<<endl;answer.pop();}}else cout<<'0';
} int main(){std::ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);cin>>n>>jump;vector<int> dis;headjump=jump+7.5;eyu[104].first = 50, eyu[104].second = 50;
for(int i=0;i<n;i++){int a, b;cin >> a >> b;a += 50, b += 50;eyu[i].first = a, eyu[i].second = b;if (a <= jump || 100 - a <= jump || b <= jump || 100 - b <= jump)isalive[i] = 1;if(isjump(i,104,headjump))dis.push_back(codis(i,104)*1000+i);}sort(dis.begin(),dis.end());if(jump>=42.5){cout<<'1';return 0;}bfs(dis);return 0;}

http://www.yayakq.cn/news/668224/

相关文章:

  • 个人主页类网站开发背景wordpress在文章里面加歌曲
  • 网站推广站群安安互联怎么上传网站
  • 电子科技产品网站建设网站建设及推广套餐
  • 淘宝客优惠券网站建设教程视频医院网站建设目的
  • 2o17甘孜建设网站临沂建网站多少钱
  • 济南公司制作网站网上商城软件开发
  • 动态ip做网站影响seo吗河南省建设厅网站公示公告
  • 东莞外贸网站推广建设建立个人网站多少钱
  • 自己做淘宝客网站吗房产信息网新楼盘
  • 成都电商网站开发建设专业网站哪家技术好
  • 长沙网站托管哪家好虾米wordpress插件
  • 阳明拍卖公司网站做网站做什么类型 比较赚钱
  • 中山精品网站建设策划如何做网站泛目录解析
  • 保定手机网站制作服务器搭建vps教程
  • 重庆荣昌网站建设报价怎么做仿制网站
  • 网站备案在哪里审批北京平面设计公司排名前十强
  • 做影视后期应该关注哪些网站带数据库的网站模板
  • 我公司是帮企业做网站的_现在要帮客户们的网站备案手机网页无法访问
  • 河南平顶山网站建设与管理专业盐城网络
  • 网站缓存实例最好用的虚拟主机WordPress
  • 佛山移动网站建设费用wordpress 文字
  • 无锡企业建站建设银行网上流览网站
  • 网站最新发布址计算机网络技术毕业设计选题
  • 精品网站建设费用 c磐石网络seo营销是什么
  • 旅游网站建设方案后台如何快速搭建自己的网站
  • 徐州专业网站建设请人建设网站 要注意什么
  • 济南高新网站建设最简单的网站建设
  • 标准化班组建设网站网站界面设计的主要内容
  • 园林景观中企动力提供网站建设头条小程序
  • pc网站转换wap网站河南省企业年报网上申报入口