update
This commit is contained in:
parent
6195d14fc3
commit
877f112296
@ -18,7 +18,7 @@ cal(a,b)
|
||||
5)a<b/2 && b is odd return cal(a,b/2)+1;
|
||||
6)a<b/2 && b is even return cal(a,b-1)+1;
|
||||
*/
|
||||
ull cal(ull a,ull b){
|
||||
ull cal(const ull a,const ull b)noexcept{
|
||||
if(a==b){
|
||||
return 0;
|
||||
}else if(a>b){
|
||||
|
81
src/oj4980/oj4980.cpp
Normal file
81
src/oj4980/oj4980.cpp
Normal file
@ -0,0 +1,81 @@
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
#include <queue>
|
||||
#include <bitset>
|
||||
|
||||
typedef long long ll;
|
||||
auto &is = std::cin;
|
||||
auto &os = std::cout;
|
||||
|
||||
struct Point{
|
||||
ll x,y;
|
||||
};
|
||||
struct Status{
|
||||
Point now;
|
||||
ll step;
|
||||
bool operator<(const Status &that)const noexcept{
|
||||
return this->step > that.step;
|
||||
}
|
||||
};
|
||||
|
||||
const ll max_nm {200+5};
|
||||
ll n, h, w, ans{std::numeric_limits<decltype(ans)>::max()};
|
||||
char map[max_nm][max_nm];
|
||||
Point me;
|
||||
|
||||
const int to_next[4][2] {
|
||||
{1,0},
|
||||
{0,1},
|
||||
{-1,0},
|
||||
{0,-1},
|
||||
};
|
||||
|
||||
void bfs(const Point start)noexcept{
|
||||
std::bitset<max_nm> vis[max_nm];
|
||||
|
||||
std::priority_queue<Status> q;
|
||||
ans = std::numeric_limits<decltype(ans)>::max();
|
||||
vis[start.x][start.y] = true;
|
||||
|
||||
q.push({start,0});
|
||||
while(q.empty()==false){
|
||||
const auto status = q.top();
|
||||
const auto nowchar = [&status]()->char{return map[status.now.x][status.now.y];};
|
||||
q.pop();
|
||||
|
||||
if(nowchar()=='a'){
|
||||
ans = std::min(ans,status.step);
|
||||
return;
|
||||
}
|
||||
for(ll i{0};i<4;i++){
|
||||
const Point next {status.now.x+to_next[i][0],status.now.y+to_next[i][1]};
|
||||
if(vis[next.x][next.y])continue;
|
||||
const auto nextchar = [&next]()->char{return map[next.x][next.y];};
|
||||
ll cost {1};
|
||||
if(next.x>h || next.x<=0 || next.y > w || next.y<=0
|
||||
|| nextchar()=='#')continue;
|
||||
if(nextchar()=='x')cost++;
|
||||
const Status next_status {next,status.step+cost};
|
||||
vis[next_status.now.x][next_status.now.y] = true;
|
||||
q.push(next_status);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int main(){
|
||||
is>>n;
|
||||
for(ll _{0};_<n;_++){
|
||||
is>>h>>w;
|
||||
for(ll i{1};i<=h;i++){
|
||||
for(ll j{1};j<=w;j++){
|
||||
is>>map[i][j];
|
||||
if(map[i][j]=='r')me.x=i,me.y=j;
|
||||
}
|
||||
}
|
||||
bfs(me);
|
||||
os<<ans<<'\n';
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user