codeforces 877D

来源:互联网 发布:淘宝我的空间怎么设置 编辑:程序博客网 时间:2024/05/29 03:43

题目链接:

http://codeforces.com/contest/877/problem/D

题解:

有段时间没怎么好好打代码了,简单的BFS打错了一个地方,找了半天。

代码:

#include <map>#include <cmath>#include <queue>#include <vector>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define met(a,b) memset(a,b,sizeof(a))#define inf 0x3f3f3f3fconst int maxn = 1000+10;int dir[4][2]={-1,0,1,0,0,1,0,-1};char mp[maxn][maxn];int dis[maxn][maxn];int x_1,y_1,x_2,y_2;int n,m,k;struct node{    int x,y,k;    node(int x,int y,int k):x(x),y(y),k(k){}};queue<node>q;void init(){    dis[x_1][y_1]=1;    for(int i=0;i<4;i++)    {        for(int j=1;j<=k;j++)        {            int xx=x_1+dir[i][0]*j;            int yy=y_1+dir[i][1]*j;            if(1<=xx&&xx<=n&&1<=yy&&yy<=m&&mp[xx][yy]=='.')            {                dis[xx][yy]=1;                q.push(node(xx,yy,1));            }            else                break;        }    }}void BFS(){    if(x_1==x_2&&y_1==y_2)    {        printf("0\n");        return;    }    init();    while(!q.empty())    {        node x=q.front();        q.pop();        if(dis[x_2][y_2])        {            printf("%d\n",dis[x_2][y_2]);            return;        }        for(int i=0;i<4;i++)        {            for(int j=1;j<=k;j++)            {                int xx=x.x+dir[i][0]*j;                int yy=x.y+dir[i][1]*j;                if(1<=xx&&xx<=n&&1<=yy&&yy<=m&&mp[xx][yy]=='.')                {                    if(!dis[xx][yy])                    {                        dis[xx][yy]=x.k+1;                        q.push(node(xx,yy,x.k+1));                    }                }                else                    break;            }        }    }    printf("-1\n");}int main(){    scanf("%d%d%d",&n,&m,&k);    for(int i=1;i<=n;i++)        scanf("%s",mp[i]+1);    scanf("%d%d%d%d",&x_1,&y_1,&x_2,&y_2);    met(dis,0);    BFS();}
原创粉丝点击