EOJ1124 bfs

一天,sunny不小心进入了一个迷宫,不仅很难寻找出路,而且有的地方还有怪物,但是sunny有足够的能力杀死怪物,但是需要一定的时间,但是sunny想早一点走出迷宫,所以请你帮助他计算出最少的时间走出迷宫,输出这个最少时间.我们规定每走一格需要时间单位1,杀死怪物也需要时间1,如果不能走到出口,则输出impossible.每次走只能是上下左右4个方向.

Input

每次首先2个数n,m(0<n,m<=200),代表迷宫的高和宽,然后n行,每行m个字符,
'S'代码你现在所在的位置,
'T'代表迷宫的出口,
'#'代表墙,你是不能走的,
'X'代表怪物,
'.'代表路,可以走.

Output

输出最少的时间走出迷宫,不能走出输出impossible.

Sample Input

4 4
S.X.
#..#
..#.
X..T
4 4
S.X.
#..#
..#.
X.#T

Sample Output

6

impossible


题目:EOJ1224

 

分析:bfs,因为是求最短路径,按层次遍历。用队列实现。注意题中访问不同点所花的时间不同,则可用优先队列实现。构造新类型存储每个节点的坐标,访问所用时间。dx[4]={-1,1,0,0},dy[]={0,0,-1,1}表示四个方向。将起点进队,每次出队后,若出队节点为目的点则终止程序,输出答案。否则直到对位空前,每次将此节点相邻但未被访问过的节点进队。若循环至队空说明无法到达此点。

 

AC代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <string>

#include <vector>

#include <algorithm>

#include <queue>

 

using namespace std;

 

char map[205][205];

int ans;

bool visited[205][205];

int dx[4]={-1,1,0,0},dy[]={0,0,-1,1};

struct Node{

   int x,y,step;

};

 

bool operator<(const Node a,const Nodeb){

   return a.step>b.step;

}

 

void bfs(int x,int y,int n,int m){

  priority_queue<Node> q;

  Node a,next;

  a.x=x;a.y=y;a.step=0;

  q.push(a);

  while(!q.empty()){

       a=q.top();

       q.pop();

 

       for(int i=0;i<4;++i){

           next.x=a.x+dx[i];

           next.y=a.y+dy[i];

           if(0<=next.x && next.x<n && 0<=next.y&& next.y<m && !visited[next.x][next.y] &&map[next.x][next.y]!='#'){

                if(map[next.x][next.y]=='.')

                    next.step=a.step+1;

                elseif(map[next.x][next.y]=='X')

                    next.step=a.step+2;

                elseif(map[next.x][next.y]=='T') {

                    ans=a.step+1;

                    return ;

               }

                q.push(next);

                visited[next.x][next.y]=true;

           }

       }

   }

  ans=-1;

}

 

int main()

{

   int n,m;

   while(~scanf("%d%d",&n,&m)){

       int i,j,x,y;

       memset(visited,false,sizeof(visited));

       for(i=0;i<n;++i){

           scanf("%s",map[i]);

           for(j=0;j<m;++j){

                if(map[i][j]=='S'){

                    x=i;y=j;

                }

           }

       }

       visited[x][y]=true;

       bfs(x,y,n,m);

       if(ans!=-1)

           cout<<ans<<endl;

       else cout<<"impossible"<<endl;

    }

   return 0;

}


### 关于EOJ DNA排序问题的解题思路 在处理EOJ中的DNA排序问题时,主要挑战在于如何高效地完成字符串数组的排序以及去重操作。由于题目涉及两个测试点可能因时间复杂度较高而超时,因此需要优化算法设计。 #### 数据结构的选择 为了降低时间复杂度并提高效率,可以引入`std::map`或者`unordered_map`来辅助实现去重功能[^1]。这些数据结构能够快速判断某项是否存在集合中,并支持高效的插入和查找操作。具体来说: - 使用 `std::set` 可以自动去除重复元素并对结果进行升序排列; - 如果还需要自定义比较逻辑,则可以选择基于哈希表的数据结构如 `unordered_set` 配合手动排序。 #### 排序策略 对于给定的一组DNA序列(通常表示为长度固定的字符串),按照字典顺序对其进行排序是一个常见需求。C++标准库提供了非常方便的方法来进行此类任务——即利用 `sort()` 函数配合合适的比较器函数对象或 lambda 表达式来指定所需的排序规则。 下面展示了一个简单的例子用于说明如何读取输入、执行必要的预处理步骤(包括但不限于删除冗余条目),最后输出经过整理的结果列表: ```cpp #include <bits/stdc++.h> using namespace std; int main(){ set<string> uniqueDNAs; string line, dna; while(getline(cin,line)){ stringstream ss(line); while(ss>>dna){ uniqueDNAs.insert(dna); // 自动过滤掉重复项 } } vector<string> sortedUnique(uniqueDNAs.begin(),uniqueDNAs.end()); sort(sortedUnique.begin(),sortedUnique.end()); for(auto it=sortedUnique.cbegin();it!=sortedUnique.cend();++it){ cout<<*it; if(next(it)!=sortedUnique.cend())cout<<" "; } } ``` 上述程序片段实现了基本的功能模块:从标准输入流逐行解析得到各个独立的DNA片段;借助 STL 容器特性轻松达成无重复记录维护目的;最终依据字母大小关系重新安排各成员位置后再统一打印出来[^3]。 #### 学习延伸至自然语言处理领域 值得注意的是,在计算机科学特别是机器学习方向上,“上下文”概念同样重要。例如 Word2Vec 这样的技术就是通过考察周围词语环境来捕捉特定词汇的意义特征[^2]。尽管两者应用场景差异显著,但从原理层面看均体现了对局部模式挖掘的关注。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值