要求:
https://www.dotcpp.com/oj/contest2325_problem3.html
这题暂未AC,存个代码,有时间再来看看哪里的问题= =
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
int main(){
int w,m,n;
scanf("%d %d %d",&w,&m,&n);
int numrecordlef[w];
int numrecordrig[w];
bool ans[w] = {
false};
int maxn = max(m,n);
int minx = min(m,n);
//int lef,rig;
int signal = 0,pos = 0,path = 0;
for(int i = 0;;i++){
signal++;
if(i*w+1<= minx && (i+1)*w >= minx){
//在第i行
int linshinum = (i)*w+1;
//printf("signal=%d\n",signal);
if(signal%2 == 0){
//偶数行,逆序
//printf("逆序\n");
for(int s = w-1;s>=0;s--){
numrecordlef[s] = linshinum++;
//printf("%d\n",numrecord[lef][s]);
if(numrecordlef[s] == minx){
ans[s] = true;
//printf("s=%d\n",s);
}
}
}
else{
//奇数行,正序
//printf("正序\n");
for(int s = 0;s<w;s++){
numrecordlef[s] = linshinum++;
//printf("%d\n",numrecord[lef][s]);
if(numrecordlef[s] == minx){
ans[s] = true;
//printf("s=%d\n",s);
}
}
}
for(int j = i;;j++){
signal++;
pos++; //记录走过多少行
if(j*w+1<= maxn && (j+1)*w >= maxn){
int linshinumm = (j)*w+1;
if((signal-1)%2 == 0){
//偶数行,逆序
//printf("逆序\n");
for(int s = w-1;s>=0;s--){
numrecordrig[s] = linshinumm++;
if(numrecordrig[s] == maxn){
ans[s] = true;
//printf("s=%d\n",s);
}
//printf("%d\n",numrecord[rig][s]);
}
}
else{
//奇数行,正序
//printf("正序\n");
for(int s = 0;s<w;s++){
numrecordrig[s] = linshinumm++;
if(numrecordrig[s] == maxn){
ans[s] = true;
//printf("s=%d\n",s);
}
//printf("%d\n",numrecord[rig][s]);
}
}
break;
}
}
break;
}
}
int t1,t2,ss = 0;
for(int i = 0;i <w;i++){
if(ans[i] == true && ss == 0){
t1 = i;
//printf("%d\n",t1);
ss++;
}
else if(ans[i] == true && ss >0){
t2 = i;
//printf("%d\n",t2);
ss++;
}
}
if(ss == 2){
printf("%d",pos-1+abs(t1-t2));
}
else{
printf("%d",pos-1);
}
}