AcWing 1111. 字母
原题链接
简单
作者:
腾杨天下
,
2021-04-12 22:13:18
,
所有人可见
,
阅读 242
简单使用dfs暴搜结束的时候更新一下最大值就好
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 25;
char a[N][N];
int st[30];
int n,m;
int cnt;
int ans=-1e9;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
bool judgeend(PII u)
{
for(int i=0;i<4;i++)
{
int x=u.first+dx[i];
int y=u.second+dy[i];
if(x>0&&x<=n&&y>0&&y<=m&&st[a[x][y]-'A']==0)return false;
}
return true;
}
void dfs(PII u)
{
if(judgeend(u))
{
ans=max(ans,cnt);
return;
}
for(int i=0;i<=3;i++)
{
int x=u.first+dx[i];
int y=u.second+dy[i];
if(x>0&&x<=n&&y>0&&y<=m&&st[a[x][y]-'A']==0)
{
cnt++;
st[a[x][y]-'A']=1;
dfs({x,y});
cnt--;
st[a[x][y]-'A']=0;
}
}
}
int main()
{
memset(st,0x3f,sizeof st);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
st[a[i][j]-'A']=0;
}
}
cnt++;
st[a[1][1]-'A']=1;
dfs({1,1});
cout<<ans<<endl;
return 0;
}