关闭

zcmu1676

标签: 搜索
25人阅读 评论(0) 收藏 举报

依次对每个数字bfs,得到的结果与从S点bfs比较,这样进行了多次bfs会超时,可以从E点开始搜索,直到把S和与它同一层都搜索完之后就可以结束了,因为这样搜索过程中遇到的数字都是<=S的步数的

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <cctype>
#include <cstring>
using namespace std;


struct Node
{
    int x;
    int y;
    int step;
    Node(int x1,int y1,int steps):x(x1),y(y1),step(steps){}
};
int starts[1][2],n,m,Visit[1005][1005],sum,STEP;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,1,-1};
char s[1005][1005];


int BFS(int a,int b)
{
    queue<Node>q;
    q.push(Node(a,b,0));
    Visit[a][b]=1;
    while(!q.empty())
    {
        Node t=q.front();
        if(t.step-1==STEP)
            return sum;
        q.pop();
        for(int i=0;i<4;i++)
        {
            int c=t.x+dx[i];
            int d=t.y+dy[i];
            if(c<n&&c>=0&&d>=0&&d<m&&s[c][d]!='T'&&Visit[c][d]!=1)
            {


                if(s[c][d]=='S')
                {
                    s[c][d]='0';
                    STEP=t.step;
                }
                if(isdigit(s[c][d])&&s[c][d]-'0'>0)sum+=s[c][d]-'0';
                q.push(Node(c,d,t.step+1));
                Visit[c][d]=1;
            }
        }
    }
    return 0;
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        int starts1=0,starts2=0;
        sum=0,STEP=1000005;
        memset(starts,0,sizeof(starts));
        memset(Visit,0,sizeof(Visit));
        for(int i=0;i<n;i++)
            scanf("%s",s[i]);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(s[i][j]=='E'){starts1=i;starts2=j;}
       printf("%d\n",BFS(starts1,starts2));
    }
    return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:35次
    • 积分:10
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档
    阅读排行
    评论排行