#include <bits/stdc++.h>
using namespace std;
int A[50],B[50],C[50];//前半 后半 和原数列
int n;
int flag;
void dfs(int a,int b,int c)//当前 a,b,c,的数组下标
{
if (a>n/2 || b>n/2 || c>n) return;//超范围
if (c==n)
{
// for (int i = 0;i<n/2;i++) cout << A[i] << " ";
// cout << endl;
// for (int i = 0;i<n/2;i++) cout << B[i] << " ";
flag = 1;
}
if(C[c]==A[b]) //只有和A当前位置相同才可以
{
B[b]=C[c];
dfs(a,b+1,c+1);
}else //问题出在了这里
{
A[a]=C[c];
dfs(a+1,b,c+1);
}
}
int main()
{
int T;cin >> T;
while (T--)
{
cin >> n;
for (int i = 0;i<=40;i++)C[i]= 0;
for (int i = 0;i<n;i++)
{
cin >> C[i];
}
A[0]=C[0];
flag = 0;
dfs(1,0,1);//
if (flag) cout << "Frederica Bernkastel"<<endl;
else cout <<"Furude Rika" << endl;
}
return 0;
}
通过了80%的数据 ,继续寻找是什么错误,盲猜应该是小问题
#include <bits/stdc++.h>
using namespace std;
int A[50],B[50],C[50];//前半 后半 和原数列
int n;
int flag;
void dfs(int a,int b,int c)//当前 a,b,c,的数组下标
{
if (a>n/2+1 || b>n/2+1) return;//超范围
if (c==n+1 && a==b)
{
// for (int i = 0;i<n/2;i++) cout << A[i] << " ";
// cout << endl;
// for (int i = 0;i<n/2;i++) cout << B[i] << " ";
flag = 1;
}
if(C[c]==A[b]) //只有和A的当前位置相同才可以
{
B[b]=C[c];
dfs(a,b+1,c+1);
}
A[a]=C[c];//问题为什么出在这里 为什么加上else就是错的
dfs(a+1,b,c+1);
}
int main()
{
int T;cin >> T;
while (T--)
{
cin >> n;
for (int i = 1;i<=n;i++)
{
cin >> C[i];
}
A[1]=C[1];//从1开始遍历
flag = 0;
dfs(2,1,2);//A B C位置的当前
if (flag) cout << "Frederica Bernkastel"<<endl;
else cout <<"Furude Rika" << endl;
}
return 0;
}
两次的代码都出在哪个else上面,实际上不需要else,直接调用就可以了,而dfs刚开始传入的参数需要自己去定义实际含义,我这里含义为处理当前位置的下标,而递归边界需要自己去尝试,手动画一下。
下面来讨论一下为什么不需要else,只有相同不仅能进入那个dfs(a,b+1,c+1),而如果不相同,应该也可以进入dfs才对,下面找个实列 1 1 2 1 1 2 就是尽管有相等的,但是我还有应该选择是不选,而换个想法,假如不要else,又多了一个选择,而且不影响结果,何乐而不为?
ps:这个题干似乎设计到了好几个动漫,寒蝉鸣泣之时,还有某科学的超电磁炮,还有re0,我是为了动漫才写的这个题。