meimu75
2024-11-03 09:51:54
这是第3次参加 CSP-J/S 了(第一次初赛没过,第二次初赛 67 复赛 115,这次初赛 97 估分 225)。
本人小学6年级。坐标 HN CS,考点是长沙理工大学金盆岭校区。
前一天我妈就把我带到了旁边的酒店,去踩了个点(之前在云塘校区骑自行车方便,这次也带了,但是发现并不方便),然后当天晚上打了一个小时的MC没干啥就睡觉了。
第二天直接去了校区,找到座位开始打小恐龙看电脑。题目发下来之后就开始写代码。
T1 扑克牌
直接就是用 map
统计不同牌的数量,然后 52-mp.size()
。
T2 地图探险
模拟,没啥。
就是先处理起点,然后执行 k 次操作,每一次计算下一个点的位置,如果合法,就前进,并且标记、统计答案,否则转向。
细节:起点算入答案,并且要标记,防止后面再走入起点是重复算入。
T3 小木棍
枚举数,然后计算需要木棍数,枚举到的第一个合法数就是答案,10分。(有个朋友跟我说她是无限枚举,50分,但是我这么搞20分)
T4 接龙
纯暴力 dfs,枚举每个人的接龙序列,然后判断,15分。
康康我的代码:
int n,k,q,r,c;
bool ans;
int l[100005];
vector<int> s[100005];
// dfs(当前轮数,上次末尾, 上次的人)
void dfs(int step,int last,int lastren)
{
if(ans)return;//已经OK了就直接不搜了。
if(step > r)
{
if(last == c)
{
ans = true;//结尾是c,有答案了
}
return;
}
for(int i = 1;i <= n;i++)//枚举人
{
if(i == lastren)continue;//不能与上一次的人重复
for(int len = 2;len <= k;len++)//枚举当前接龙的长度
{
for(int lt = 1;lt+len-1 <= l[i];lt++)//枚举序列左端点
{
int rt = lt+len-1;//计算序列右端点
if(step == 1)//第一次
{
if(s[i][lt] == 1)//必须是以1开头
{
dfs(step+1,s[i][rt],i);
}
}
else
{
if(s[i][lt] == last)//必须以上一次的末尾开头
{
dfs(step+1,s[i][rt],i);
}
}
}
}
}
return;
}
int main()
{
int t;
cin >> t;
while(t--)
{
cin >> n >> k >> q;
for(int i = 1;i <= n;i++)
{
cin >> l[i];
s[i].clear();
s[i].push_back(0);
for(int j = 1;j <= l[i];j++)
{
int x;
cin >> x;
s[i].push_back(x);
}
}
while(q--)
{
cin >> r >> c;
ans = 0;
dfs(1,-1,0);
cout << ans << "\n";
}
}
return 0;
}