bfs——Red and Black

A - Red and Black

 

 1 #include<bits/stdc++.h>
 2 using  namespace std;
 3 const int maxn=25;
 4 int n;int m;
 5 int x;int y;int ans;
 6 char s[maxn][maxn];//输入迷宫 
 7 int ah[maxn][maxn];//用ah数组标记是否走过,0代表没走过,1代表走过 
 8 struct node{
 9     int x;int y;
10 }st;
11 int movede[4][2]={ {1 ,0},{-1 , 0},{0 , 1},{0 ,-1} };//代表移动 
12 bool ok(int fx,int fy){//用ok数组代表该点是否能走,若能走则返回true,否则返回false 
13     if(fx<1||fx>m||fy<1||fy>n)return false;//该判断是用来判断该点是否在迷宫外 
14 //    else if(s[fx][fy]=='@')return false;//该判断是用来判断该点是否为起点 ; 
15 //    else if(s[fx][fy]=='#')return false; //该判断是用来判断该点是否为障碍;
16     //上面两判断能用 
17     else if(s[fx][fy]!='.')return false;
18     //来代替; 
19     else if(s[fx][fy]=='.'&&ah[fx][fy]==1)return false;//该判断是用来判断点是否走过; ah[fx][fy]=1时代表走过 
20     else if(s[fx][fy]=='.'&&ah[fx][fy]==0)return true;//ah【fx】【fy】=0时代表没走过 
21 }
22 void bfs(){//搜索函数 
23     ah[st.x][st.y]=1; 
24     queue<node>q;//创建队列q; 
25     q.push(st);//将起点放入q这个队列中 
26     while(!q.empty()){//当q这个队列空的话,就代表无路可走,那么跳出循环 
27         ans++;
28         node t=q.front();//记录队列中排第一个点 
29         q.pop();//扔掉队列中第一个点 
30         node newnode;//记录下一个能走的点 
31         for(int i=0;i<4;i++){//寻找下一个能走的点 
32             int fx=t.x+movede[i][0];
33             int fy=t.y+movede[i][1];
34             if(ok(fx,fy)){//若ok返回true,这个点代表能走。就将fx,fy放入newnode 
35                 newnode.x=fx;
36                 newnode.y=fy;
37                 ah[fx][fy]=1;
38                 q.push(newnode);//然后将newnode放入队列q中 
39             }
40         }
41     }
42 }
43 int main(){
44     while(scanf("%d%d",&n,&m)!=EOF){
45         if(n==0&&m==0)break;
46         memset(ah,0,sizeof ah);//使ah数组全为0,开始搜索 
47         for(int i=1;i<=m;i++){
48             scanf("%s",s[i]+1);//输入迷宫,由于循环是从1开始的,所以s[i]输入时要加1; 
49         }
50         for(int i=1;i<=m;i++){//用来寻找出发点 
51             for(int j=1;j<=n;j++){
52                 if(s[i][j]=='@'){
53                     st.x=i;st.y=j;break;//当找到出发点这跳出循环; 
54                 }
55             }
56         }
57         ans=0;//ans代表能走个数。该处等于0,给其初始化,进行下一组搜索 
58         bfs();//广度优先搜索,来搜索能走个数 
59         printf("%d\n",ans);
60     }
61 }

这道题题意是在一房间中。一个人站在一块黑色瓷砖“@”上,他可以移动到四个相邻的瓷砖之一。但他不能在红色瓷砖“#”上移动,只能在黑色瓷砖“.”上移动。让我们求他最大能走的砖数。

这道题用到了bfs(广度优先搜索),遍历图,去寻找能走的黑色瓷砖“.”数。

这题可作为做bfs这类题的模板。

posted @ 2020-01-19 23:23  kitalekita  阅读(120)  评论(0编辑  收藏  举报