Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 19656 Accepted Submission(s): 4783
第1行为两个整数m, n (1 ≤ m, n ≤ 100),分别表示迷宫的行数和列数,接下来m行,每行包括n个字符,其中字符'.'表示该位置为空地,字符'*'表示该位置为障碍,输入数据中只有这两种字符,每组测试数据的最后一行为5个整数k, x1, y1, x2, y2 (1 ≤ k ≤ 10, 1 ≤ x1, x2 ≤ n, 1 ≤ y1, y2 ≤ m),其中k表示gloria最多能转的弯数,(x1, y1), (x2, y2)表示两个位置,其中x1,x2对应列,y1, y2对应行。
#include<stdio.h> #include<string.h> #include<queue> #define MAX 110 using namespace std; char map[MAX][MAX]; int vis[MAX][MAX]; int n,m; int w,x1,x2,y1,y2; void getmap() { int i,j; for(i=1;i<=n;i++) { getchar(); for(j=1;j<=m;j++) { scanf("%c",&map[i][j]); } } } struct node { int x,y; }; int judge(int x,int y) { if(x>0&&x<=n&&y>0&&y<=m&&map[x][y]!='*') return 1; return 0; } void bfs() { int move[4][2]={0,1,0,-1,1,0,-1,0}; int i,j,ok=0; queue<node>q; node beg,end; beg.x=x1; beg.y=y1; q.push(beg); while(!q.empty()) { end=q.front(); q.pop(); if(end.x==x2&&end.y==y2) { if(vis[end.x][end.y]<=w) { printf("yes\n"); ok=1; } else break; } else { for(i=0;i<4;i++) { beg.x=end.x+move[i][0]; beg.y=end.y+move[i][1]; while(judge(beg.x,beg.y)) { if(vis[beg.x][beg.y]==-1) { vis[beg.x][beg.y]=vis[end.x][end.y]+1; q.push(beg); } beg.x+=move[i][0];//沿着这个方向继续走 beg.y+=move[i][1]; } } } } if(!ok) printf("no\n"); } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); getmap(); scanf("%d%d%d%d%d",&w,&y1,&x1,&y2,&x2); memset(vis,-1,sizeof(vis)); bfs(); } return 0; }