原题:hdu1312
B: 不要停下来啊
题目描述
丁丁妹因为上山挖大头菜而误打误撞进入了一处古代遗迹,古代遗迹是一个n×m 的迷宫,
丁丁妹所处的位置用'@'标出,'.'表示道路,'#'表示墙壁。
为了逃出迷宫,丁丁妹想知道她最长能在迷宫中走多少格。
我们的目的地根本不重要,只要继续前行就好了,只要不止步,路就在前方!
所以,不要停下来啊……
输入描述
多组数据,第一行为一个正整数T ,表示数据组数。
接下来T 组数据,每组格式如下:
第一行为两个正整数n,m 描述了迷宫的大小。
接下来一个n×m 的矩阵,元素mat[i][j]是'@','.','#'三者之一,意义见题目描述。
数据保证:1≤n≤20,1≤m≤20
bfs套路queue实现:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include<queue> 6 using namespace std; 7 8 int n,m; 9 int T; 10 char s[25][25]; 11 int dis[4][2]= { //四个方向 ,[][0]代表x轴上的变动,[][1]代表y轴上的变动 12 {0,1}, 13 {0,-1}, 14 {1,0}, 15 {-1,0}// 16 }; 17 struct d { 18 int x,y; 19 }; 20 int a,b; 21 int ans=0; 22 int check(int x,int y) { 23 if(s[x][y]=='.') { 24 return 1; 25 } else { 26 return 0; 27 } 28 } 29 void f(int x,int y) { 30 queue<d> q; 31 d begin,next; 32 begin.x=x; 33 begin.y=y; 34 ans=1; 35 q.push(begin); 36 while(!q.empty()) { 37 begin=q.front(); 38 q.pop(); 39 for(int i=0; i<4; i++) { 40 next.x=begin.x+dis[i][1]; 41 next.y=begin.y+dis[i][0]; 42 if(check(next.x,next.y)==1) { 43 s[next.x][next.y]='#'; 44 //cout<<next.x<<" "<<next.y<<endl; 45 //这个题其实是在找以起点为开始找分叉树,有一点歧义吧 46 //如果不是做过我会以为他是在找从起点到死胡同的最长路径, 47 // 如果是那样的化就需要检查遇到死胡同的时候用max函数 48 //而且不能标记路径而是,找完所有的死胡同 49 50 q.push(next); 51 ans++; 52 } 53 } 54 } 55 } 56 57 58 int main() { 59 cin>>T; 60 while(T--) { 61 cin>>m>>n; 62 memset(s,'#',sizeof(s)); 63 64 for(int i=1; i<=n; i++) { 65 for(int j=1; j<=m; j++) { 66 cin>>s[i][j]; 67 if(s[i][j]=='@') { 68 a=i,b=j; 69 } 70 } 71 } 72 /* 73 for(int i=0; i<=n+1; i++) { 74 for(int j=0; j<=m+1; j++) { 75 cout<<s[i][j]; 76 } 77 cout<<" "; 78 } 79 */ 80 f(a,b); 81 82 cout<<ans<<endl; 83 84 } 85 86 87 return 0; 88 }
dfs递归+stack实现 (stack要快一点)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <stack> 6 using namespace std; 7 int a,b; 8 char s[24][24]; 9 int T; 10 int n,m; 11 int ans=0; 12 int dis[4][2]= {{1,0},{-1,0},{0,-1},{0,1}}; 13 14 void f1(int x,int y) { 15 for(int i=0; i<4; i++) { 16 int dx=x+dis[i][0]; 17 int dy=y+dis[i][1]; 18 if(s[dx][dy]=='.') { 19 ans++; 20 s[dx][dy]='#'; 21 f1(dx,dy); 22 } 23 } 24 } 25 26 struct d { 27 int x,y; 28 }; 29 void f2(int x,int y) { 30 stack<d> st; 31 d begin,next; 32 begin.x=x; 33 begin.y=y; 34 ans=1; 35 st.push(begin); 36 37 while(!st.empty()) { 38 int g=0; 39 begin=st.top(); 40 for(int i=0; i<4; i++) { 41 next.x=begin.x+dis[i][0]; 42 next.y=begin.y+dis[i][1]; 43 if(s[next.x][next.y]=='.') { 44 s[next.x][next.y]='#'; 45 ans++; 46 st.push(next); 47 g=1; 48 break; 49 } 50 } 51 if(g==0)st.pop(); 52 53 } 54 55 56 } 57 58 59 int main () { 60 61 while(cin>>m>>n) { 62 if(m==n&&n==0)break; 63 64 memset(s,'#',sizeof(s)); 65 66 for(int i=1; i<=n; i++) { 67 for(int j=1; j<=m; j++) { 68 cin>>s[i][j]; 69 if(s[i][j]=='@')a=i,b=j; 70 } 71 } 72 f1(a,b);//f2(a,b); 73 74 cout<<ans<<endl; 75 76 } 77 return 0; 78 }
(f1()需要初始化ans=1)