题目链接:
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 0x3f3f3f3f
const 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();
}