[关闭]
@lychee123 2017-07-04T14:58:49.000000Z 字数 1877 阅读 1001

Power oj 2545: Lovestring(稍复杂BFS)

搜索


题面链接

在一个n*m的矩阵里从(1,1)走到(n,m),要求这条路径中存在一个lovestring,并且保证所走的路程最少。

3 4 4//(1<=N,M,K<=100)
LOVE
ABC#
EFGH
LOVE//长度为k的lovestring字符串

1 2 10
AA
AAAAAAAAAA

在很多种状态中我可以选择选或者不选这种状态,所以都是应该加入队列的。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n,m,k,x,y,z,i,j,l;
  4. char mp[111][111],s[111];
  5. int vis[111][111][111];//表示在x,y点所获得的lovestring的长度z。
  6. int dir[4][2]={0,1,0,-1,1,0,-1,0};
  7. struct node
  8. {
  9. int x,y,z;//表示到(x,y)点所构成的love字符串的长度为z
  10. };
  11. int BFS()
  12. {
  13. queue<node>q;
  14. node now,next;
  15. now.x=1;
  16. now.y=1;
  17. for(int i=1;i<=n;i++)
  18. for(int j=1;j<=m;j++)
  19. for(int l=0;l<=k;l++)
  20. vis[i][j][l]=INT_MAX;
  21. if(mp[1][1]==s[1])
  22. {
  23. now.z=1;
  24. vis[1][1][1]=0;
  25. }
  26. else
  27. {
  28. now.z=0;
  29. vis[1][1][0]=0;
  30. }
  31. q.push(now);
  32. while(!q.empty())
  33. {
  34. now=q.front();
  35. //printf("%c\n",mp[now.x][now.y]);
  36. q.pop();
  37. if(now.x==n&&now.y==m&&now.z==k)
  38. return vis[n][m][k];
  39. for(i=0;i<4;i++)
  40. {
  41. next.x=now.x+dir[i][0];
  42. next.y=now.y+dir[i][1];
  43. if(next.x<1||next.x>n||next.y<1||next.y>m||mp[next.x][next.y]=='#')
  44. continue;
  45. if(now.z==k)//已经遇到一个完整的字符串了
  46. {
  47. next.z=k;
  48. if(vis[next.x][next.y][k]>vis[now.x][now.y][k]+1)
  49. {
  50. vis[next.x][next.y][k]=vis[now.x][now.y][k]+1;
  51. q.push(next);
  52. }
  53. }
  54. else
  55. {
  56. if(mp[next.x][next.y]==s[1])//能构成love字符串首位
  57. {
  58. next.z=1;
  59. if(vis[next.x][next.y][1]>vis[now.x][now.y][now.z]+1)
  60. {
  61. vis[next.x][next.y][1]=vis[now.x][now.y][now.z]+1;
  62. q.push(next);
  63. }
  64. }
  65. if(now.z!=0)//前面有一部分字符串出现
  66. {
  67. if(mp[next.x][next.y]==s[now.z+1])//能继续构成love字符串
  68. {
  69. next.z=now.z+1;
  70. if(vis[next.x][next.y][next.z]>vis[now.x][now.y][now.z]+1)
  71. {
  72. vis[next.x][next.y][next.z]=vis[now.x][now.y][now.z]+1;
  73. q.push(next);
  74. }
  75. }
  76. else
  77. {
  78. next.z=0;
  79. if(vis[next.x][next.y][0]>vis[now.x][now.y][now.z]+1)
  80. {
  81. vis[next.x][next.y][0]=vis[now.x][now.y][now.z]+1;
  82. q.push(next);
  83. }
  84. }
  85. }
  86. else
  87. {
  88. next.z=0;
  89. if(vis[next.x][next.y][next.z]>vis[now.x][now.y][now.z]+1)
  90. {
  91. vis[next.x][next.y][next.z]=vis[now.x][now.y][now.z]+1;
  92. q.push(next);
  93. }
  94. }
  95. }
  96. }
  97. }
  98. return -1;
  99. }
  100. int main()
  101. {
  102. while(~scanf("%d%d%d",&n,&m,&k))
  103. {
  104. for(i=1;i<=n;i++)
  105. scanf("%s",mp[i]+1);
  106. scanf("%s",s+1);
  107. int ans=BFS();
  108. printf("%d\n",ans);
  109. }
  110. return 0;
  111. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注