http://acm.hdu.edu.cn/showproblem.php?pid=1728
方法应该没问题,错误找不出来。。彻底败在测试上了。

code:
#include <stdio.h>
#include "iostream.h"
#include "queue.h"
#include "memory.h"
char map[105][105];
int vit[105][105];
int fangxiang[4][2]={0,1,0,-1,1,0,-1,0};
int m,n;
int k,bgx,bgy,endx,endy; //拐弯数,起点坐标和终点坐标
int flag; //标记是否到达
struct point //结构体点
{
int x;
int y;
int turns;
int toward;
};
queue <point> q;
int cango(int x,int y) //判断是否是有效扩展点
{
if(x>=1&&x<=m&&y>=1&&y<=n&&!vit[x][y]&&map[x][y]=='.')
{
return 1;
}
return 0;
}
void bfs() //开始广搜
{
while(!q.empty()) //队列不为空
{
point now;
now=q.front();
q.pop();
if(now.x==endx&&now.y==endy&&now.turns<=k&&map[endx][endy]=='.') //找到答案
{
flag=1;
return ;
}
if(now.turns>k) //各种剪枝
{
continue;
}
if(flag==1)
{
return ;
}
if(now.turns==k&&now.x-endx!=0&&now.y-endy!=0)
{
continue;
}
int newx,newy,newturns,newtoward;
int i;
for(i=0;i<4;i++) //四个方向扩展
{
newx=now.x+fangxiang[i][0];
newy=now.y+fangxiang[i][1];
if(cango(newx,newy)) //是有效扩展点
{
vit[newx][newy]=1;
if(now.toward==-1) //为起始点
{
newtoward=i;
newturns=now.turns;
}else if(now.toward==i) //不用拐弯
{
newtoward=i;
newturns=now.turns;
}else if(now.toward!=i) //需要拐弯
{
newtoward=i;
newturns=now.turns+1;
}
point next;
next.x=newx;
next.y=newy;
next.turns=newturns;
next.toward=newtoward;
q.push(next);
}
}
}
}
using namespace std;
int main(int argc, char *argv[])
{
int t;
scanf("%d",&t);
while(t--)
{
while(!q.empty()) //队列清空
{
q.pop();
}
memset(vit,0,sizeof(vit)); //访问清空
scanf("%d%d",&m,&n);
int i,j;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
cin>>map[i][j]; //输入图的信息
}
}
scanf("%d%d%d%d%d",&k,&bgy,&bgx,&endy,&endx); //输入拐弯数起点终点坐标
if(map[bgx][bgy]!='.'||map[endx][endy]!='.')
{
printf("no\n");
}else
{
point start;
start.x=bgx;
start.y=bgy;
start.toward=-1;
start.turns=0;
vit[bgx][bgy]=1;
q.push(start);
flag=0;
bfs();
if(flag==1)
{
printf("yes\n");
}else
{
printf("no\n");
}
}
}
return 0;
}