Grid.cpp
/* Headers */#include<cstdio>#include<cstring>#include<iostream>#include<cctype> #include<algorithm>#include<climits>#include<vector>/* define */typedef std::pair<int,int> point;/* consts */const int MAXN = 2010;using namespace std;namespace FastIO{ const int BUFSIZE=1<<20; char ibuf[BUFSIZE],*is=ibuf,*it=ibuf; char obuf[BUFSIZE],*os=obuf,*ot=obuf+BUFSIZE; inline char getch(){ if(is==it) it=(is=ibuf)+fread(ibuf,1,BUFSIZE,stdin); return (is==it)?EOF:*is++; } inline int getint(){ int res=0,neg=0,ch=getch(); while(!(isdigit(ch)||ch=='-')&&ch!=EOF) ch=getch(); if(ch=='-'){ neg=1;ch=getch(); } while(isdigit(ch)){ res=(res<<3)+(res<<1)+(ch-'0'); ch=getch(); } return neg?-res:res; } inline void flush(){ fwrite(obuf,1,os-obuf,stdout); os=obuf; } inline void putch(char ch){ *os++=ch; if(os==ot) flush(); } inline void putint(int res){ static char q[10]; if(res==0) putch('0'); else if(res<0){ putch('-'); res=-res; } int top=0; while(res){ q[top++]=res%10+'0'; res/=10; } while(top--) putch(q[top]); } inline void space(int x){ if(!x)puts(""); else putchar(' '); }} using namespace FastIO;/* defintions */char word[MAXN][MAXN];int n,m;bool visited[MAXN][MAXN];/* functions */inline void init(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ cin>>word[i]; }}inline void find_answer(){ init(); vector<point>v,nexts; for(v.push_back({0, 0}); !v.empty();v = nexts){ point p=v.back(); cout<<word[p.first][p.second]; char another='z'; for(point k : v){ int x=1,y=0; for(int i=0;i<2;++i){ swap(x,y); int dx=k.first+x; int dy=k.second+y; if(dx>=n||dy>=m)continue; another=min(another,word[dx][dy]); } } nexts.clear(); for(point k : v){ int x=1,y=0; for(int i=0;i<2;++i){ swap(x,y); int dx=k.first+x; int dy=k.second+y; if(dx>=n||dy>=m)continue; if(visited[dx][dy])continue; if(word[dx][dy]==another){ nexts.push_back({dx,dy}); visited[dx][dy]=1; } } } }}int main(void){ find_answer(); space(0); return 0;}