代码有点啰嗦,主要是暴力。有没有办法用记忆化呢??
#include<bits/stdc++.h>
using namespace std;
struct thi {int idx,val;};
struct ti{int idx,iidx;};
int t;
int n,k,q;
vector<thi> a[6][100009];
vector<ti> aidx[6][200009];
//分别是:还剩几人 末尾值 上一次第几人
bool dfs(int ren,int aid,int shang ){//到头来用记忆化
if(ren==1){
for(int i=0;i<aidx[t][aid].size();i++){
if(aidx[t][aid][i].idx==shang)continue;
int id=aidx[t][aid][i].idx,j=aidx[t][aid][i].iidx-1;
for(;j>=0 && a[t][id][j].val!=1 && (aidx[t][aid][i].iidx-j+1)<=k;j--);
if(a[t][id][j].val==1&& (aidx[t][aid][i].iidx-j+1)<=k)return 1;
}
return 0;
}
//否则找随便一个
for(int i=0;i<aidx[t][aid].size();i++){
if(aidx[t][aid][i].idx==shang)continue;
int id=aidx[t][aid][i].idx,j=aidx[t][aid][i].iidx-1;
for(;j>=0 &&(aidx[t][aid][i].iidx-j+1)<=k;j--){
if(dfs(ren-1,a[t][id][j].val,aidx[t][aid][i].idx))return 1;
}
}
return 0;
}
int main() {
// freopen("chain.in","r",stdin);
// freopen("chain.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(nullptr);cout.tie(nullptr);
cin>>t;
while(t--) {
cin>>n>>k>>q;
int l=0;
for(int i=0; i<n; i++) {
cin>>l;
int tmp;
for(int j=0; j<l; j++) {
cin>>tmp;
thi ttt;
ttt.idx=j,ttt.val=tmp;
a[t][i].push_back(ttt);
ti tt;
tt.idx=i;
tt.iidx=j;
aidx[t][tmp].push_back(tt);
}
}
while(q--) {
int r,c;
cin>>r>>c;
cout<<dfs(r,c,-1)<<endl;
}
}
return 0;
}