这份代码 80pts,TLE on 5、6、14、17,之前讨论区说到的都写了(除了钦定一个红色棋子在另一个的上方,有没有大佬教一教怎么做)
#include<bits/stdc++.h>
#define ll long long
#define mkp(x,y) make_pair(x,y)
#define CLR(a,x) memset(a,x,sizeof(a))
#define rep(i,a,b) for(register short i=(a);i<=(b);++i)
#define y1 Y1
#define il inline
//#define int long long
//#define int __int128
using namespace std;
const int N=15;
const int M=2e6+5;
const int INF=2e9+5;
short ID,t,n,m,sx1,sy1,sx2,sy2,sx3,sy3;char c[N][N];
int f[M],head[M],ind[M],num,cnt,start;
bitset<M>g,vis;
int id[N][N][N][N][N][N][2];
struct EDGE {
int v,next;
}edge[M<<2];
il void add_edge(int x,int y) {
edge[++cnt]=(EDGE){y,head[x]};
head[x]=cnt;
}
short dx[]={-1,0,0,1};
short dy[]={0,1,-1,0};
il void Clear() {
for(register int i=0;i<num;i++) {
f[i]=g[i]=vis[i]=ind[i]=0;
head[i]=-1;
}
sx1=sx2=sx3=sy1=sy2=sy3=0;
num=cnt=0;
}
il bool check(short x1,short y1,short x2,short y2,short x3,short y3) {
if(x1>n||x1<1||y1>m||y1<1)return 0;
if(x2>n||x2<1||y2>m||y2<1)return 0;
if(x3>n||x3<1||y3>m||y3<1)return 0;
if(x1==x2&&y1==y2)return 0;
if(c[x1][y1]=='#'||
c[x2][y2]=='#'||
c[x3][y3]=='#')return 0;
return 1;
}
il void BFS() {
queue<int>q;
for(int i=0;i<num;i++)
if(vis[i])q.push(i);
while(!q.empty()) {
int u=q.front();q.pop();
if(u==start)return;
for(int i=head[u];~i;i=edge[i].next) {
int v=edge[i].v;
if(!vis[v]) {
ind[v]--;
if(!g[u]) {
g[v]=1;f[v]=f[u]+1;
vis[v]=1;
q.push(v);
} else if(!ind[v]) {
g[v]=0;f[v]=f[u]+1;
vis[v]=1;
q.push(v);
}
}
}
}
}
il void init1() {
rep(x1,1,n)rep(y1,1,m)rep(x2,1,n)rep(y2,1,m)rep(x3,1,n)rep(y3,1,m) {
if(check(x1,y1,x2,y2,x3,y3))
id[x1][y1][x2][y2][x3][y3][0]=num++,
id[x1][y1][x2][y2][x3][y3][1]=num++;
}
}
il void init2() {
rep(x1,1,n)rep(y1,1,m)rep(x2,1,n)rep(y2,1,m)rep(x3,1,n)rep(y3,1,m) {
if(!check(x1,y1,x2,y2,x3,y3))continue;
int cur=id[x1][y1][x2][y2][x3][y3][0];
rep(i,0,3) {
short nx=x1+dx[i],ny=y1+dy[i];
if(check(nx,ny,x2,y2,x3,y3)) {
add_edge(id[nx][ny][x2][y2][x3][y3][1],cur);
ind[cur]++;
}
nx=x2+dx[i],ny=y2+dy[i];
if(check(x1,y1,nx,ny,x3,y3)) {
add_edge(id[x1][y1][nx][ny][x3][y3][1],cur);
ind[cur]++;
}
}
rep(i,0,2) {
short nx=x3+dx[i],ny=y3+dy[i];
if(check(x1,y1,x2,y2,nx,ny)) {
add_edge(id[x1][y1][x2][y2][nx][ny][0],cur^1);
ind[cur^1]++;
}
}
if(x3==1) {
vis[cur]=vis[cur^1]=1;
g[cur]=0;g[cur^1]=1;
f[cur]=f[cur^1]=0;
} else if((x1==x3&&y1==y3)||(x2==x3&&y2==y3)) {
vis[cur]=vis[cur^1]=1;
g[cur]=g[cur^1]=0;
f[cur]=f[cur^1]=0;
} else {
if(!ind[cur])vis[cur]=1,g[cur]=f[cur]=0;
if(!ind[cur^1])vis[cur^1]=1,g[cur^1]=f[cur^1]=0;
}
}
}
il void solve() {
cin>>n>>m;
rep(i,1,n)cin>>(c[i]+1);
rep(i,1,n)rep(j,1,m) {
if(c[i][j]=='X')sx3=i,sy3=j;
if(c[i][j]=='O') {
if(sx1==0&&sy1==0)sx1=i,sy1=j;
else sx2=i,sy2=j;
}
}
init1();
init2();
start=id[sx1][sy1][sx2][sy2][sx3][sy3][0];
BFS();
if(!vis[start])cout<<"Tie"<<endl;
else if(g[start])cout<<"Red "<<f[start]<<endl;
else cout<<"Black "<<f[start]<<endl;
Clear();
}
int main() {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>ID>>t;
CLR(head,-1);
while(t--)
solve();
return 0;
}