@lychee123
2017-07-04T06:58:49.000000Z
字数 1877
阅读 1227
搜索
在一个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
在很多种状态中我可以选择选或者不选这种状态,所以都是应该加入队列的。
#include<bits/stdc++.h>using namespace std;int n,m,k,x,y,z,i,j,l;char mp[111][111],s[111];int vis[111][111][111];//表示在x,y点所获得的lovestring的长度z。int dir[4][2]={0,1,0,-1,1,0,-1,0};struct node{int x,y,z;//表示到(x,y)点所构成的love字符串的长度为z};int BFS(){queue<node>q;node now,next;now.x=1;now.y=1;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int l=0;l<=k;l++)vis[i][j][l]=INT_MAX;if(mp[1][1]==s[1]){now.z=1;vis[1][1][1]=0;}else{now.z=0;vis[1][1][0]=0;}q.push(now);while(!q.empty()){now=q.front();//printf("%c\n",mp[now.x][now.y]);q.pop();if(now.x==n&&now.y==m&&now.z==k)return vis[n][m][k];for(i=0;i<4;i++){next.x=now.x+dir[i][0];next.y=now.y+dir[i][1];if(next.x<1||next.x>n||next.y<1||next.y>m||mp[next.x][next.y]=='#')continue;if(now.z==k)//已经遇到一个完整的字符串了{next.z=k;if(vis[next.x][next.y][k]>vis[now.x][now.y][k]+1){vis[next.x][next.y][k]=vis[now.x][now.y][k]+1;q.push(next);}}else{if(mp[next.x][next.y]==s[1])//能构成love字符串首位{next.z=1;if(vis[next.x][next.y][1]>vis[now.x][now.y][now.z]+1){vis[next.x][next.y][1]=vis[now.x][now.y][now.z]+1;q.push(next);}}if(now.z!=0)//前面有一部分字符串出现{if(mp[next.x][next.y]==s[now.z+1])//能继续构成love字符串{next.z=now.z+1;if(vis[next.x][next.y][next.z]>vis[now.x][now.y][now.z]+1){vis[next.x][next.y][next.z]=vis[now.x][now.y][now.z]+1;q.push(next);}}else{next.z=0;if(vis[next.x][next.y][0]>vis[now.x][now.y][now.z]+1){vis[next.x][next.y][0]=vis[now.x][now.y][now.z]+1;q.push(next);}}}else{next.z=0;if(vis[next.x][next.y][next.z]>vis[now.x][now.y][now.z]+1){vis[next.x][next.y][next.z]=vis[now.x][now.y][now.z]+1;q.push(next);}}}}}return -1;}int main(){while(~scanf("%d%d%d",&n,&m,&k)){for(i=1;i<=n;i++)scanf("%s",mp[i]+1);scanf("%s",s+1);int ans=BFS();printf("%d\n",ans);}return 0;}