C++ 使用最小交换数将两行排序在一起
问题: 我的算法是从1迭代到N。在每次迭代中,我找到两个“I”所在的框。例如,对于第一次迭代中的数据m: 3 3 2.2 11 我存储两个1的位置。接下来,我开始移动那个特定的I,它更接近它的原始位置,通过将它与前面盒子中两个球中较大的一个交换。如果前面的框包含相同的球,那么我将球“I”与另一列中的球交换。因此,在上述情况下,在第一次迭代中,我将第一列中的1替换为第二列中的2。一旦第一个球我到达它的位置,我对另一个球我也做同样的事情。算法就是这样运行的:C++ 使用最小交换数将两行排序在一起,c++,algorithm,sorting,C++,Algorithm,Sorting,问题: 我的算法是从1迭代到N。在每次迭代中,我找到两个“I”所在的框。例如,对于第一次迭代中的数据m: 3 3 2.2 11 我存储两个1的位置。接下来,我开始移动那个特定的I,它更接近它的原始位置,通过将它与前面盒子中两个球中较大的一个交换。如果前面的框包含相同的球,那么我将球“I”与另一列中的球交换。因此,在上述情况下,在第一次迭代中,我将第一列中的1替换为第二列中的2。一旦第一个球我到达它的位置,我对另一个球我也做同样的事情。算法就是这样运行的: #include <iostrea
#include <iostream>
using namespace std;
static int mark[2][9], in[2][9];
int N, ANS=0, s1, s2, r, t1, t2, v1, v2, p, tmp;
int main(){
cin >> N;
for(int i=1; i<=N; ++i)cin >> in[0][i] >> in[1][i]; //Inputting
for(int i=1; i<=N; ++i){
for(int j=1; j<=N; ++j){ //Searching for one of the i.
if(in[0][j]==i){s1=j; v1=0; break;}
if(in[1][j]==i){s1=j; v1=1; break;}
}
in[v1][s1]=1234; //temporarily removing the i found.
for(int j=1; j<=N; ++j){ //finding the other i
if(in[1][j]==i){s2=j; v2=1; break;}
if(in[0][j]==i){s2=j; v2=0; break;}
}
in[v1][s1]=i; //restoring previous i
if(s1==s2){ //Deciding on which i to begin swapping with.
int m=s1, chk;
while(m>0 && in[0][m]==in[1][m])m--;
chk=(s1+m)%2; t1=t2=s1;
if(chk && in[!v1][m]<in[!v2][m]){r=v2; v2=v1; v1=r;}
else if(!chk && in[v1][m]<in[v2][m]){r=v2; v2=v1; v1=r;}
}
else{
if(s1>s2){r=v2; v2=v1; v1=r;}
t1=(s1<s2)?s1:s2; t2=(s1<s2)? s2:s1;
}
r=v1;
while(t1>i){ //moving the first i to required position.
if(in[0][t1-1]>in[1][t1-1])p=0;
else if(in[0][t1-1]<in[1][t1-1])p=1; //Deciding on the balls to swap.
else p=!r;
tmp=in[p][t1-1]; in[p][t1-1]=in[r][t1]; in[r][t1]=tmp; //Swapping
r=p; t1-=1;
ANS+=1; //incrementing swaps.
}
r=v2; //Doing the same for the second i.
while(t2>i){
if(in[0][t2-1]>in[1][t2-1])p=0;
else if(in[0][t2-1]<in[1][t2-1])p=1;
else p=!r;
tmp=in[p][t2-1]; in[p][t2-1]=in[r][t2]; in[r][t2]=tmp;
r=p; t2-=1; ANS+=1;
}
}
cout << ANS << '\n'; //Printing the answer.
return 0;
}
我得到了错误的答案,但我的代码适用于示例测试用例和自定义测试用例。可以指出一些我的程序失败的测试用例,或者指出我的算法中的错误吗
谢谢。您的答案是否要在结尾加上\n?这些程序中的某些程序会因额外字符而使您失败。是的。spoj法官声明我的程序在第四个测试用例中失败。