AC
2026-02-01 19:48:43
发布于:四川
#include<bits/stdc++.h>
using namespace std;
const int fni=0xc0c0c0c0;
int n,m,p,hs[2100000],sta[50000],cnt,res;
void pr(int x){for(int i=0;i<=m;i++)printf("%d",(x>>i*3)&7);}
int f[2][16][50000];
char s[30][30];
int num[30];
void dfs1(int pos,int msk,int fre,int tms){
if(pos==m+1){
if(tms)return;
for(int i=1;i<pos;i++){
if((num[i]==1||num[i]==2||num[i]==4)&&num[i-1]==3&&num[i+1]==3)return;
if(num[i]==6&&(num[i-1]==3||num[i+1]==3))return;
}
cnt++,hs[msk]=cnt,sta[cnt]=msk;
return;
}
num[pos]=0;dfs1(pos+1,msk,fre,tms);
num[pos]=3,dfs1(pos+1,msk+(3<<pos3),fre,tms);
num[pos]=5;dfs1(pos+1,msk+(5<<pos3),fre,tms);
if(!pos||num[pos-1]==0||num[pos-1]5){
num[pos]=1,dfs1(pos+1,msk+(1<<pos3),fre,tms+1);
num[pos]=6,dfs1(pos+1,msk+(6<<pos3),fre,tms);
}
if(!pos||(num[pos-1]!=2&&num[pos-1]!=6&&num[pos-1]!=4))num[pos]=2,dfs1(pos+1,msk+(2<<pos3),fre,tms-1);
if((!pos||num[pos-1]==0||num[pos-1]==5||num[pos-1]==3)&&fre<2)num[pos]=4,dfs1(pos+1,msk+(4<<pos3),fre+1,tms);
}
int nex(int y,int k){
if(ym-1){
int L=k>>m3;k-=(L<<m3);
if(L!=0&&L!=3&&L!=5)return 0;
return hs[k<<3];
}
return hs[k];
}
int P=0,Q=1;
void chmx(int j,int w,int id,int nw,int K,int bon=0){
int nid=nex(j,K);
if(nid&&nw<=p)f[Q][nw][nid]=max(f[Q][nw][nid],f[P][w][id]+bon);
}
int nex2(int y,int K){
for(int i=y,j=0;i<=m;i++){
if(((K>>i3)&7)==1)j++;
if(((K>>i3)&7)==2&&!j--)return i;
}
}
int las1(int y,int K){
for(int i=y,j=0;i>=0;i--){
if(((K>>i3)&7)==2)j++;
if(((K>>i3)&7)==1&&!j--)return i;
}
}
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=0;i<n;i++)scanf("%s",s[i]);
if(n<m){
for(int i=0;i<n;i++)for(int j=i+1;j<m;j++)swap(s[i][j],s[j][i]);
swap(n,m);
}
dfs1(0,0,0,0);
memset(f[P],fni,sizeof(f[P]));
f[P][0][hs[0]]=0;
for(int i=0;i<n;i++)for(int j=0;j<m;j++,P^=1,Q^=1){
memset(f[Q],fni,sizeof(f[Q]));
for(int w=0;w<=p;w++)for(int id=1;id<=cnt;id++){
if(f[P][w][id]<0)continue;
int k=sta[id];
int H=0,Y=(k>>j*3)&7,U=(k>>(j+1)*3)&7,I=(k>>(j+2)*3)&7;
if(U==6)continue;
int K=k-(Y<<j*3),KHU=K;
K-=(U<<(j+1)*3);int KH=K;
if(j)H=((k>>(j-1)*3)&7),K-=(H<<(j-1)*3);
int bon=(H==5)+(Y==5)+(U==5)+(I==5);
int nob=(H!=0&&H!=5)+(Y!=0&&Y!=5)+(U!=0&&U!=5)+(I!=0&&I!=5);
if((H==0||H==5)&&(U==0||U==5)&&s[i][j]!='#'){
if(s[i][j]=='S'||s[i][j]=='T')chmx(j,w,id,w,KHU+(4<<j*3),bon);
else chmx(j,w,id,w,KHU+(6<<j*3),bon);
}
if(H!=6&&(U==0||U==5||U==3)&&s[i][j]!='S'&&s[i][j]!='T'){
chmx(j,w,id,w,KHU);
if(s[i][j]!='#')chmx(j,w,id,w+1,KHU+(5<<j*3),nob);
}
if(s[i][j]=='#')continue;
if(U!=0&&U!=5&&U!=3){
if(H!=0&&H!=5){
if(s[i][j]=='S'||s[i][j]=='T')continue;
if(H==3)continue;
if(Y!=0&&Y!=5)continue;
if(H==1&&U==1)chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3)-(1<<nex2(j,K)*3),bon);
if(H==2&&U==1)chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3),bon);
if(H==2&&U==2)chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3)+(1<<las1(j,K)*3),bon);
if(H==6&&U==1)chmx(j,w,id,w,K+(1<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3),bon);
if(H==6&&U==2)chmx(j,w,id,w,K+(2<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3),bon);
if(H==4&&U==4){chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3),bon);continue;}
if(H==4&&U==1||H==1&&U==4)chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3)+(2<<nex2(j,K)*3),bon);
if(H==4&&U==2||H==2&&U==4)chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3)+(3<<las1(j,K)*3),bon);
if(H==6&&U==4)chmx(j,w,id,w,K+(4<<(j-1)*3)+(3<<j*3)+(3<<(j+1)*3),bon);
continue;
}
if(s[i][j]=='S'||s[i][j]=='T'){
if(U==1)chmx(j,w,id,w,KH+(3<<j*3)+(3<<(j+1)*3)+(2<<nex2(j,K)*3),bon);
if(U==2)chmx(j,w,id,w,KH+(3<<j*3)+(3<<(j+1)*3)+(3<<las1(j,K)*3),bon);
if(U==4)chmx(j,w,id,w,KH+(3<<j*3)+(3<<(j+1)*3),bon);
continue;
}
chmx(j,w,id,w,KH+(U<<j*3)+(3<<(j+1)*3),bon);
continue;
}
if(H!=0&&H!=5&&H!=3){
if(U==3)continue;
if(s[i][j]=='S'||s[i][j]=='T'){
if(H==1)chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(2<<nex2(j,K)*3)+(U<<(j+1)*3),bon);
if(H==2)chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(3<<las1(j,K)*3)+(U<<(j+1)*3),bon);
if(H==4)chmx(j,w,id,w,K+(3<<(j-1)*3)+(3<<j*3)+(U<<(j+1)*3),bon);
if(H==6)chmx(j,w,id,w,K+(4<<(j-1)*3)+(3<<j*3)+(U<<(j+1)*3),bon);
continue;
}
if(H==1||H==2||H==4)chmx(j,w,id,w,K+(3<<(j-1)*3)+(H<<j*3)+(U<<(j+1)*3),bon);
else chmx(j,w,id,w,K+(1<<(j-1)*3)+(2<<j*3)+(U<<(j+1)*3),bon);
}
}
}
for(int j=1;j<=cnt;j++){
bool ok=true;
int k=sta[j];
for(int t=0;t<=m;t++)if(((k>>t*3)&7)!=0&&((k>>t*3)&7)!=3&&((k>>t*3)&7)!=5){ok=false;break;}
if(!ok)continue;
for(int i=0;i<=p;i++)res=max(res,f[P][i][j]);
}
printf("%d\n",res);
return 0;
}
这里空空如也







有帮助,赞一个