百练 名人和佐助
来源:互联网 发布:小米快传能传软件吗 编辑:程序博客网 时间:2024/05/01 15:26
这个题目就是一个bfs 加深了我对bfs的理解 :
这个题其实不用vis 任何状态都扩展也能搜出来 只不过时间高一点 我们以前用vis的原因都是不用扫描 也就是剪枝
这个题目中的剪枝在于扩展状态的时候 如果法力值比原来的法力值大 那么说明这个潜力比较大 ,可以更新状态,如果小于等于的话 一定和以前的一样甚至更差 所以根本不用考虑,刚开始要把f都设置为-1
#include <stdio.h>#include <iostream>#include <algorithm>#include <queue>#include <string.h>using namespace std;int t,n,m;struct node {int x,y,step,f;node (int x1,int x2,int x3,int x4) :x(x1),y(x2),step(x3),f(x4) {}};int f[300][300];char mat[300][300];int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};int check(int i,int j) {if(i<=n&&i>=1&&j<=m&&j>=1) return 1;return 0;}int bfs(int x,int y){ memset(f,-1,sizeof(f)); queue<node> q; q.push(node(x,y,0,t)); f[x][y]=t; while(!q.empty()) { node k=q.front(); int xnow=k.x,ynow=k.y; if(mat[xnow][ynow]=='+') return k.step; for(int i=0;i<4;i++) { if(check(xnow+dx[i],ynow+dy[i])) { int dec=0; if(mat[xnow+dx[i]][ynow+dy[i]]=='#') dec=1; else dec=0; // cout<<dec<<'!'<<endl; if(k.f-dec>f[xnow+dx[i]][ynow+dy[i]]) { f[xnow+dx[i]][ynow+dy[i]]=(k.f-dec); q.push(node(xnow+dx[i],ynow+dy[i],k.step+1,k.f-dec)); } } } q.pop(); } return -1;}int main(){ cin>>n>>m>>t; int x,y; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>mat[i][j]; if(mat[i][j]=='@') x=i,y=j; } } cout<<bfs(x,y)<<endl; // for(int i=1;i<=n;i++) // { // for(int j=1;j<=m;j++) // { // cout<<f[i][j]<<' '; // } // cout<<endl; // } // cout<<check(1,4)<<"mark"<<endl; return 0; }
0 0
- 百练 名人和佐助
- 名人
- 名人
- 名人博客和习题网站
- 百练 4155 鸣人和佐助
- 百练 4115 鸣人和佐助
- 名人和凡人差别在什么地方
- 如何选择和聘请名人00-6348
- 如何选择和聘请名人00-6348
- 百练 2684 求阶乘的和
- 百练 2679 整数的立方和
- 百练---整数的立方和----2679
- 百练--求分数序列和---2683
- 百练---求阶乘的和---2684
- 百练 3756 多边形内角和
- 百练_2679:整数的立方和
- 百练_2683:求分数序列和
- 百练_2684:求阶乘的和
- mount --bind和硬连接的区别
- Linux系统安装
- ThinkPhp中M和D的区别
- mac配置java环境
- hibernate和mybaitis的理解
- 百练 名人和佐助
- 配置Raspberry Pi上Raspbian系统为自动以root帐户登录
- F Design 总结
- ThinkPHP 模板范围判断输出 In 标签与 Range 标签
- 高德定位集成
- 想知道你未来什么样,很简单,就看你现在在做什么就能知道。
- Qt之QLineEdit详解(附源码)
- thinkphp中两张表中不同字段的相同值——之if的判定
- Java 中的中文编码问题深入分析