Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.41 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define f first
  3. #define s second
  4. #define mp make_pair
  5. #define ll long long
  6. #define pii pair <int,int>
  7. #define pb push_back
  8.  
  9. using namespace std;
  10. int n,m; string pr,su;
  11. int di[]={1,-1,0,0};
  12. int dj[]={0,0,-1,1};
  13. char inp[205][205];
  14. bool yes[205],viss[205][205][205],visp[205][205][205];
  15. int ans[205][205];
  16. void dfsp(int _i,int _j,int nw){
  17. visp[_i][_j][nw]=true;
  18. if (nw==(pr.length()-1)) return;
  19. for (int i=0;i<4;i++){
  20. int tmpi=_i+di[i],tmpj=_j+dj[i];
  21. if (tmpi>=0&&tmpi<n&&tmpj>=0&&tmpj<m){
  22. if (!visp[tmpi][tmpj][nw+1]&&(inp[tmpi][tmpj]==pr[nw+1])){
  23. dfsp(tmpi,tmpj,nw+1);
  24. }
  25. }
  26. }
  27. }
  28.  
  29. void dfss(int _i,int _j,int nw){
  30. viss[_i][_j][nw]=true;
  31. if (nw==0) return;
  32. for (int i=0;i<4;i++){
  33. int tmpi=_i+di[i],tmpj=_j+dj[i];
  34. if (tmpi>=0&&tmpi<n&&tmpj>=0&&tmpj<m){
  35. if (!viss[tmpi][tmpj][nw-1]&&(inp[tmpi][tmpj]==su[nw-1])){
  36. dfss(tmpi,tmpj,nw-1);
  37. }
  38. }
  39. }
  40. }
  41.  
  42. int main(){
  43. string inpsoal;
  44. cin>>inpsoal;
  45. scanf("%d%d",&n,&m);
  46.  
  47. for (int i=0;i<n;i++) scanf("%s",inp[i]);
  48. cin>>pr; cin>>su;
  49.  
  50. for (int i=0;i<pr.length();i++){
  51. if (pr.length()-i>su.length()) continue;
  52. bool ok=true;
  53. for (int j=i,k=0;j<pr.length();j++,k++){
  54. if (pr[j]!=su[k]){
  55. ok=false;
  56. j=pr.length();
  57. }
  58. }
  59. yes[i]=ok;
  60. }
  61. for (int i=0;i<n;i++){
  62. for (int j=0;j<m;j++){
  63. if (pr[0]==inp[i][j]) dfsp(i,j,0);
  64. if (su[(su.size()-1)]==inp[i][j]) dfss(i,j,(su.size()-1));
  65. }
  66. }
  67. int mini=1e9;
  68. for (int i=0;i<n;i++){
  69. for (int j=0;j<m;j++){
  70. if (su[0]!=inp[i][j]) continue;
  71. for (int k=0;k<pr.size();k++){
  72. if (visp[i][j][k]&&yes[k]&&viss[i][j][0]) mini=min(mini,k+(int)su.length());
  73. }
  74. }
  75. }
  76. if (mini!=1e9){
  77. printf("%d\n",mini);
  78. return 0;
  79. }
  80. queue<pii>q;
  81. memset(ans,-1,sizeof(ans));
  82. for (int i=0;i<n;i++){
  83. for (int j=0;j<m;j++){
  84. if ((inp[i][j]==pr[(pr.length()-1)])&&visp[i][j][pr.length()-1]){
  85. q.push(mp(i,j));
  86. ans[i][j]=0;
  87. }
  88. }
  89. }
  90. int tmpi,tmpj;
  91. while(!q.empty()){
  92. tmpi=q.front().f;
  93. tmpj=q.front().s;
  94. q.pop();
  95. if (inp[tmpi][tmpj]==su[0]&&viss[tmpi][tmpj][0]){
  96. printf("%d\n",pr.length()+su.length()+ans[tmpi][tmpj]-1);
  97. return 0;
  98. }
  99. for (int i=0;i<4;i++){
  100. int xtmp=tmpi+di[i],ytmp=tmpj+dj[i];
  101. if(xtmp>=0&&xtmp<n&&ytmp>=0&&ytmp<m){
  102. if (ans[xtmp][ytmp]==-1){
  103. ans[xtmp][ytmp]=ans[tmpi][tmpj]+1;
  104. q.push(mp(xtmp,ytmp));
  105. }
  106. }
  107. }
  108. }
  109. puts("-1");
  110. return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement