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

原文地址:https://www.cnblogs.com/fangziyuan/p/13161649.html