标签:lin std 个数 提交 node bsp char int stream
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
no
yes
1 #include<iostream>
2 #include<cstring>
3 #include<queue>
4 using namespace std;
5 char map[105][105];
6 int visit[105][105];
7
8 int m,n,k;
9
10 int dx[4]={0,0,1,-1};
11 int dy[4]={1,-1,0,0};
12
13 typedef struct node{
14 int x;
15 int y;
16 int count;
17 };
18
19 queue<node> q;
20
21 bool isCanGo(int x,int y){
22 if(x>=1&&x<=n&&y>=1&&y<=m&&map[x][y]==‘.‘){
23 return true;
24 }
25 return false;
26 }
27
28 void bfs(int x1,int y1,int x2,int y2){
29 int i;
30 node pos1,pos2;
31 pos1.x=x1;
32 pos1.y=y1;
33 pos1.count=-1;
34 q.push(pos1);
35 visit[x1][y1]=1;
36 while(!q.empty()){//这里的搜索关键点在于方向的计数以及不重复遍历,广搜和深搜都可以
37 pos1=q.front();
38 q.pop();//从起点开始出发找一个方向往前走
39 for(i=0;i<4;i++){
40 pos2.x=pos1.x+dx[i];
41 pos2.y=pos1.y+dy[i];
42 while(isCanGo(pos2.x,pos2.y)){//如果该点可以到达
43 if(visit[pos2.x][pos2.y]==0){//如果没有被访问过就访问
44 visit[pos2.x][pos2.y]=1;
45 pos2.count=pos1.count+1;//并没有改变方向 ,只相比出队的点转换了一个方向
46 q.push(pos2);
47 if(pos2.x==x2&&pos2.y==y2&&pos2.count<=k){//符合要求到达最终节点
48 cout << "yes" << endl;
49 return;
50 }
51 }//继续朝这个方向走,直到走不了了再换方向
52 pos2.x+=dx[i];
53 pos2.y+=dy[i];
54 }
55 }
56 }
57 cout << "no" << endl;
58 return;
59 }
60
61 int main(){
62 int x1,y1,x2,y2;
63 int t;
64 cin>>t;
65 while(t--){
66 memset(map, 0, sizeof(map));
67 memset(visit, 0, sizeof(visit));
68 while (!q.empty()){
69 q.pop();
70 }
71 cin>>n>>m;
72 for(int i=1;i<=n;i++){
73 for(int j=1;j<=m;j++){
74 cin>>map[i][j];
75 }
76 }//其中x1,x2对应列,y1, y2对应行,这里对其进行更改一下顺序
77 cin>>k>>y1>>x1>>y2>>x2;
78 if (x1 == x2 && y1 == y2)
79 cout << "yes" << endl;
80 else
81 bfs(x1,y1,x2,y2);
82 }
83 return 0;
84 }
标签:lin std 个数 提交 node bsp char int stream
原文地址:https://www.cnblogs.com/tangyimin/p/10566053.html