求转弯最少的走路方式!!!!
#include<stdio.h>
#include<string.h>
#include<queue> using namespace std; struct node { int x,y; int step; friend bool operator<(node a,node b) { return a.step>b.step; } }; char map[200][200]; int visit[200][200],n,m,p; int dir[4][2]={0,1,1,0,-1,0,0,-1}; int judge(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]=='.') return 1; return 0; } int dfs(int sx,int sy,int dx,int dy) { priority_queue<node>q; int i,x,y; node cur,next; cur.x=sx;cur.y=sy;cur.step=-1; q.push(cur); visit[sx][sy]=1; if(sx==dx&&sy==dy) return 1; while(!q.empty()) { next=q.top(); q.pop(); for(i=0;i<4;i++) { x=next.x+dir[i][0]; y=next.y+dir[i][1]; while(judge(x,y))//同一方向走到底 { if(visit[x][y]==0) { cur.x=x; cur.y=y; cur.step=next.step+1; if(x==dx&&y==dy&&cur.step<=p) return 1; q.push(cur); visit[x][y]=1; } x=x+dir[i][0]; y=y+dir[i][1]; } } } return 0; } int main() { int i,T,sx,sy,dx,dy; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); memset(visit,0,sizeof(visit)); for(i=1;i<=n;i++) scanf("%s",map[i]+1); scanf("%d%d%d%d%d",&p,&sy,&sx,&dy,&dx); if(dfs(sx,sy,dx,dy))//输入方式坑人 printf("yes\n"); else printf("no\n"); } return 0;}
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728