问题请见:https://wzoi.cc/s/1718/2197
可以解释一下我的代码中子程序f(1)的逻辑吗?最好文字说明:
#include<bits/stdc++.h>
#define maxn 1005
#define oo 200
using namespace std;
int n,m,t=0;
int rd[maxn]={0};
vector<int>g[maxn];
char a[maxn][maxn],c[maxn*2];
int sx[oo],sy[oo],lx[oo]={0},ly[oo]={0};
bool ok,vis[oo]={0},v[oo]={0},f[oo][oo]={0};
void f1(int x)
{
if(x>t)
{
for(int i=1;i<x;i++) printf("%c",c[i]);
printf("\n");
return;
}
for(int i='A';i<='Z';i++) if(!rd[i]&&v[i])
{
c[x]=i;
for(int k=0;k<g[i].size();k++) rd[g[i][k]]--;
v[i]=false;
f1(x+1);
for(int k=0;k<g[i].size();k++) rd[g[i][k]]++;
v[i]=true;
}
}
int main()
{
for(int i=0;i<oo;i++) sx[i]=sy[i]=oo;
scanf("%d%d\n",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='.') continue;
vis[a[i][j]]=v[a[i][j]]=1;
sx[a[i][j]]=min(sx[a[i][j]],i);
sy[a[i][j]]=min(sy[a[i][j]],j);
lx[a[i][j]]=max(lx[a[i][j]],i);
ly[a[i][j]]=max(ly[a[i][j]],j);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) if(vis[a[i][j]])
{
vis[a[i][j]]=0;
t++;
int k=a[i][j];
for(int t=sy[k];t<=ly[k];t++)
if(a[sx[k]][t]!=k&&!f[k][a[sx[k]][t]])
g[k].push_back(a[sx[k]][t]),rd[a[sx[k]][t]]++,f[k][a[sx[k]][t]]=1;
for(int t=sy[k];t<=ly[k];t++)
if(a[lx[k]][t]!=k&&!f[k][a[lx[k]][t]])
g[k].push_back(a[lx[k]][t]),rd[a[lx[k]][t]]++,f[k][a[lx[k]][t]]=1;
for(int t=sx[k];t<=lx[k];t++)
if(a[t][sy[k]]!=k&&!f[k][a[t][sy[k]]])
g[k].push_back(a[t][sy[k]]),rd[a[t][sy[k]]]++,f[k][a[t][sy[k]]]=1;
for(int t=sx[k];t<=lx[k];t++)
if(a[t][ly[k]]!=k&&!f[k][a[t][ly[k]]])
g[k].push_back(a[t][ly[k]]),rd[a[t][ly[k]]]++,f[k][a[t][ly[k]]]=1;
}
f1(1);
return 0;
}