ICPC-搜索-CF516DIV2-1064D

这个数据结构用的相当巧妙

题目
http://codeforces.com/contest/1064/problem/D
给你n,m表行列数
x,y是起点位置
L,R是你能向左走的数量和向右走的数量(向上向下无限制)
给你相关地图,求从起点能到达的格子数
思路
一开始就想到BFS。但是WA test40
然后看了大佬的解法,感觉世界都亮了。
因为我没考虑一件事,上下和左右,应该优先拿上下的,这样可以使得所有格子都是最短路径到达。
所以:deque出场了,双端队列,自己了解一下啦。

代码

#include<bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))//不能mem(double)
#define ll long long
const double eps=3e-8;
const int mod=10;
const int maxn=10005;
int sum=0;
struct node{
    int x,y,rx,ry;
    node(int xx,int yy,int l,int r):x(xx),y(yy),rx(l),ry(r){}
    node(){}
};
char a[2010][2010];
bool vis[2010][2010];
int n,m;
int sx,sy,L,R;
deque<node>q;
int bfs(int xx,int yy){
    q.clear();
    mem(vis,0);
    q.push_back(node(xx,yy,L,R));
    while(!q.empty()){
        node tmp=q.front();
        q.pop_front();
        int x=tmp.x;
        int y=tmp.y;
        if(vis[x][y])continue;
        //cout<<"num:"<<sum<<" xy="<<x<<" "<<y<<endl;
        vis[x][y]=1;
        sum++;
        if(x>1&&a[x-1][y]=='.') q.push_front(node(x-1, y, tmp.rx, tmp.ry));//up
        if(x<n&&a[x+1][y]=='.') q.push_front(node(x+1, y, tmp.rx, tmp.ry));//down
        if(y>1&&a[x][y-1]=='.'&&tmp.rx) q.push_back(node(x, y-1, tmp.rx-1, tmp.ry));//left
        if(y<m&&a[x][y+1]=='.'&&tmp.ry) q.push_back(node(x, y+1, tmp.rx, tmp.ry-1));//right
    }
    return sum;
}
int main(){
    cin>>n>>m;
    cin>>sx>>sy;
    cin>>L>>R;
    for(int i=1;i<=n;i++){
        scanf("%s",a[i]+1);//快很多
    }
    cout<<bfs(sx,sy)<<endl;
    return 0;
}

中间输出看看
样例一的中间变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值