宽搜基础题
思路很简单,注意细节。
走过的节点一定要打上标记//tag数组
三维字符串输入一定要注意
1 #include <stdio.h> 2 #include <iostream> 3 #include <string> 4 #include <algorithm> 5 #include <string> 6 #include <string.h> 7 #include <math.h> 8 #include <queue> 9 #define MAXN 35 10 11 using namespace std; 12 13 int L,R,C; 14 char a[MAXN][MAXN][MAXN]; 15 int tag[MAXN][MAXN][MAXN]; 16 int ans; 17 struct pos{ 18 int x,y,z; 19 int t; 20 }; 21 pos start; 22 int dx[6] = {1, 0, -1, 0 , 0 , 0}, dy[6] = {0, 1, 0, -1,0 ,0},dz[6] = {0, 0, 0, 0,1,-1}; 23 24 int judge(int nx,int ny,int nz) 25 { 26 if(0 <= nx && nx < L && 0 <= ny && ny < R && 0 <= nz && nz < C) 27 return 1; 28 else return 0; 29 } 30 int bfs() 31 { 32 queue<pos> que; 33 que.push(start); 34 while(!que.empty()) 35 { 36 pos temp = que.front(); 37 que.pop(); 38 for(int i = 0;i<6;i++) 39 { 40 int nx = temp.x-dx[i],ny = temp.y-dy[i],nz = temp.z-dz[i]; 41 if(a[nx][ny][nz] == 'E') 42 { 43 printf("Escaped in %d minute(s). ",temp.t+1); 44 return 1; 45 } 46 if(judge(nx,ny,nz) && a[nx][ny][nz]=='.'&&!tag[nx][ny][nz]) 47 { 48 pos now; 49 now.x = nx;now.y = ny;now.z = nz; 50 now.t = temp.t+1; 51 tag[nx][ny][nz] = 1; 52 que.push(now); 53 } 54 } 55 } 56 return 0; 57 } 58 int main() 59 { 60 freopen("caicai.txt","r",stdin); 61 while(cin>>L>>R>>C , L&&R&&C) 62 { 63 memset(a,0,sizeof(a)); 64 memset(tag,0,sizeof(tag)); 65 int i,j,k; 66 for(i = 0;i<L;i++) 67 for(j = 0;j<R;j++) 68 { 69 for(k = 0;k<C;k++) 70 { 71 cin>>a[i][j][k]; 72 if(a[i][j][k] == 'S') 73 { 74 start.x = i;start.y = j;start.z = k;start.t = 0; 75 tag[i][j][k] = 1; 76 } 77 } 78 getchar();//一定要记得getchar; 79 } 80 if(!bfs()) 81 cout<<"Trapped! "; 82 } 83 return 0; 84 } 85 //如下也是对的(●'◡'●) 86 87 // for(i = 0;i<L;i++) 88 // for(j = 0;j<R;j++) 89 // { 90 // cin>>a[i][j]; 91 // for(k = 0;k<C;k++) 92 // { 93 // if(a[i][j][k] == 'S') 94 // { 95 // start.x = i;start.y = j;start.z = k;start.t = 0; 96 // tag[i][j][k] = 1; 97 // } 98 // } 99 // }
附:字符串输入总结
scanf不能接受空格、制表符Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;
二者字符串接受结束后自动加' '。
(没明白看这句话:scanf("%s",str)在遇到' '(回车)或' '(空格)时输入结束,但' '(回车)或' '(空格)停留在出入缓冲区,如处理不慎会影响下面的输入;gets(str)遇到' '(回车)时输入结束,但' '(回车)已被替换为' ', 存储于字符串中,输入缓冲中没有遗留的' '(回车),不会影响后续的输入。)
使用scanf("%s",&s);函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。
当需要输入带空格的字符串时用gets(),但是保证之前没有输入回车,如果有回车的话要getchar();
cin>>:
输入结束条件 :遇到Enter、Space、Tab键。
对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)
运算符“>>”的作用是跳过空白,读入后面的非空白字符,直到遇到另一个空白字符为止,并在串尾放一个字符‘