13B:回文子串
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
给定一个字符串,寻找并输出字符串中最长回文子串。回文串即从左到右和从右到左读都一样的字符串。
如果字符串中包含多个回文子串,则返回第一个。 - 输入
- 第一行是整数n,字符串的个数(n < 20)
- 输出
- 接下来n行,每行一个字符串
字符串的长度不超过100 - 样例输入
-
3 ab babadec scdedcd
- 样例输出
-
a bab cdedc
1 #include<iostream> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 char a[12][12]; 6 struct node{ 7 int x, y, step; 8 node(int xx, int yy, int ss):x(xx),y(yy),step(ss){} 9 }; 10 bool vis[12][12]; 11 int dirx[4] = {0,0,1,-1}; 12 int diry[4] = {1,-1,0,0}; 13 int main(){ 14 int k; 15 cin>>k; 16 while(k--){ 17 int m, T; 18 cin>>m>>T; 19 int i, j; 20 int sx, sy; 21 memset(vis, 0, sizeof(vis)); 22 memset(a,0,sizeof(a)); 23 queue<node>q; 24 for(i = 1; i <= m; i++) 25 for(j = 1; j <= m; j++){ 26 cin>>a[i][j]; 27 if(a[i][j]=='S'){ 28 sx = i, sy = j; 29 } 30 } 31 q.push(node(sx,sy,0)); 32 vis[sx][sy] = true; 33 bool flag = false; 34 while(!q.empty()){ 35 node no = q.front(); 36 q.pop(); 37 if(a[no.x][no.y]=='E'){ 38 if(no.step<=T){ 39 cout<<"YES"<<endl; 40 flag = true; 41 } 42 break; 43 } 44 for(int i = 0; i < 4; i++){ 45 int nx = no.x+dirx[i]; 46 int ny = no.y+diry[i]; 47 if((a[nx][ny]=='.'||a[nx][ny]=='E')&&!vis[nx][ny]){ 48 q.push(node(nx,ny,no.step+1)); 49 vis[nx][ny] = true; 50 } 51 } 52 } 53 if(!flag) cout<<"NO"<<endl; 54 } 55 return 0; 56 }
备注:又是一道BFS水题。要养成把队列放在循环里面来声明的好习惯,要不然总是忘了清空orz