ametake 2015-03-02 07:10 采纳率: 0%
浏览 1806

初学C++编程,有没有哪位大神愿意帮我看一下?

一道双向链表的题目,我按刘汝佳书上的写的,基本上和刘汝佳写的程序没什么区别,不一样的地方我认为我这样写也没错,但是不知道为什么评测时标程就AC,我写的就WA,有没有前辈愿意帮我看一下哪里出了问题?不胜感激!
标程

 // UVa12657 Boxes in a Line
// Rujia Liu
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 100000 + 5;
int n, left[maxn], right[maxn];

inline void link(int L, int R) {
  right[L] = R; left[R] = L;
}

int main() {
    freopen("1.txt","r",stdin);
    freopen("2.txt","w",stdout);
  int m, kase = 0;
  while(scanf("%d%d", &n, &m) == 2) {
    for(int i = 1; i <= n; i++) {
      left[i] = i-1;
      right[i] = (i+1) % (n+1);
    }
    right[0] = 1; left[0] = n;
    int op, X, Y, inv = 0;

    while(m--) {
      scanf("%d", &op);
      if(op == 4) inv = !inv;
      else {
        scanf("%d%d", &X, &Y);
        if(op == 3 && right[Y] == X) swap(X, Y);
        if(op != 3 && inv) op = 3 - op;
        if(op == 1 && X == left[Y]) continue;
        if(op == 2 && X == right[Y]) continue;

        int LX = left[X], RX = right[X], LY = left[Y], RY = right[Y];
        if(op == 1) {
          link(LX, RX); link(LY, X); link(X, Y);
        }
        else if(op == 2) {
          link(LX, RX); link(Y, X); link(X, RY);
        }
        else if(op == 3) {
          if(right[X] == Y) { link(LX, Y); link(Y, X); link(X, RY); }
          else { link(LX, Y); link(Y, RX); link(LY, X); link(X, RY); }
        }
      }
    }

    int b = 0;
    long long ans = 0;
    for(int i = 1; i <= n; i++) {
      b = right[b];
      if(i % 2 == 1) ans += b;
    }
    if(inv && n % 2 == 0) ans = (long long)n*(n+1)/2 - ans;
    printf("Case %d: %lld\n", ++kase, ans);
  }
  return 0;
}

我的代码

 //Boxes in a line-doubly linked list
#include<cstdio>
#include<algorithm>
using namespace std;

int left[100010],right[100010];

void linked(int l,int r){
    right[l]=r;left[r]=l;                                        
} 

int main(){
    int n,m,kase=0;
    while (scanf("%d%d",&n,&m)==2){
        for (int i=1;i<=n;i++){
            left[i]=i-1;
            right[i]=(i+1)%(n+1);//good deal
        }
        right[0]=1;left[0]=n;//notice!!!
        int op,x,y,inv;
        while (m--){
            scanf("%d",&op);
            if (op==4) inv=!inv;
            else {
                scanf("%d%d",&x,&y);
                if (op==3&&right[y]==x) swap(x,y);//all are changed!!!
                if (op!=3&&inv) op=3-op;
                if (op==1&&x==left[y]) continue;
                if (op==2&&x==right[y]) continue;
                int lx=left[x],rx=right[x],ly=left[y],ry=right[y];
                if (op==1){
                    linked(lx,rx);linked(ly,x);linked(x,y);
                }
                else if (op==2){
                    linked(lx,rx);linked(y,x);linked(x,ry);//here is wrongTUT
                }
                else if (op==3){
                    if (right[x]==y){
                        linked(lx,y);linked(y,x);linked(x,ry);
                    }
                    else {
                        linked(ly,x);linked(x,ry);linked(lx,y);linked(y,rx);
                    }
                }
            }
        }
        int b=0;
        long long ans=0;
        for (int i=1;i<=n;i++){
            b=right[b];
            if (i%2==1) ans+=b;
        }
        if (inv&&n%2==0) ans=(long long)n*(n+1)/2-ans;
        printf("Case %d: %lld\n",++kase,ans);
    }
    return 0;
}

谢谢各位前辈了!

  • 写回答

2条回答 默认 最新

  • Eleven 2015-03-04 10:04
    关注

    请Debug下单步调试,应该很容易发现问题的。

    评论

报告相同问题?

悬赏问题

  • ¥15 解决一个加好友限制问题 或者有好的方案
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)