题目:给定一个n*m大的纸张,上面表明了每块上的字母,在其背后给定了对应位置的字母的value,在最后给出需要剪出来的剪纸的字母序列。
方法:暴力搜索。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
char map[502][502];
int Map[502][502];
int vis[502][502];
char s[30];
int ans=-10000000;
int len=0;
void dfs(int l,int r,int t,int sum)
{
sum+=Map[l][r];
if(t==len)
{
if(ans<sum) ans=sum;
return;
}
vis[l][r]=1;
if(map[l-1][r]==s[t]&&!vis[l-1][r]) dfs(l-1,r,t+1,sum);
if(map[l][r-1]==s[t]&&!vis[l][r-1]) dfs(l,r-1,t+1,sum);
if(map[l+1][r]==s[t]&&!vis[l+1][r]) dfs(l+1,r,t+1,sum);
if(map[l][r+1]==s[t]&&!vis[l][r+1]) dfs(l,r+1,t+1,sum);
vis[l][r]=0;
}
int main()
{
int m,n;
int t;
cin>>t;
while(t--)
{
cin>>m>>n;
ans=-10000000;
memset(map,0,sizeof(map));
memset(Map,0,sizeof(Map));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%s",&map[i][1]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&Map[i][j]);
scanf("%s",s);
len=strlen(s);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(map[i][j]==s[0])
dfs(i,j,1,0);
if(ans==-10000000) //找不到的情况
cout<<-1<<endl;
else
cout<<ans<<endl;
}
return 0;
}