百练 名人和佐助

来源:互联网 发布:小米快传能传软件吗 编辑:程序博客网 时间: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
原创粉丝点击