zoukankan      html  css  js  c++  java
  • uva 101 The Blocks Problem 解题报告!

    题意:http://poj.org/showmessage?message_id=72732(很好的翻译)

    解题思路:数组链表(双向)模拟即可   特别要注意指针初始的时候为空!!

    解题代码:

    View Code
    // File Name: uva101.cpp
    // Author: darkdream
    // Created Time: 2013年04月26日 星期五 19时55分53秒
    
    #include<vector>
    #include<list>
    #include<map>
    #include<set>
    #include<deque>
    #include<stack>
    #include<bitset>
    #include<algorithm>
    #include<functional>
    #include<numeric>
    #include<utility>
    #include<sstream>
    #include<iostream>
    #include<iomanip>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<ctime>
    
    using namespace std;
    struct point
    {
       int date;
       struct point *next,*last;
    };
    struct point points[100];
    int n ;
    struct point *p ,*q;
    int  find(int a, int b)
    {
       int okq = 0;
       int okp = 0;
       for(int i = 0 ;i < n; i ++)
         {
             if(points[i].next == NULL)
                 continue;
    
             if(!okp)
             {
               p = points[i].next;
               while(p != NULL)
               {
                  if(p->date == a)
                  {
                    okp = i;
                    break;
                  }
                 p = p->next;
               }
             }
             
             
             if(!okq)
             {
               q = points[i].next;
               while(q != NULL)
               {
                  if(q->date == b)
                  {
                    okq = i;
                    break;
                  }
                 q = q->next;
               }
             
             }
             if(okp && okq)
                 if(okp == okq)
                     return 0;
                 else 
                     return 1;
            
         }
       return 0;
    }
    void op1(int a, int b)
    {
      if(!find(a,b))
          return;
      struct point *temp = NULL;
      temp = p->next;
      p->next = NULL;
      while(temp  != NULL)
      {
          points[temp->date].next = temp;
          temp->last = &points[temp->date];
          temp = temp->next;
          if(temp != NULL)
            temp->last->next = NULL;
      }
      temp = q->next;
      q->next = NULL;
      while(temp  != NULL)
      { 
          points[temp->date].next = temp;
          temp->last = &points[temp->date];
          temp = temp->next;
          if(temp != NULL)
            temp->last->next = NULL;
      }
      p->last->next = NULL;
      q->next = p;
      p->last = q;
       
    
    
    }
    void op2(int a,int b)
    {
        if(!find(a,b))
            return;
      struct point *temp = NULL;
      temp = p->next;
      p->next = NULL;
      while(temp  != NULL)
      {
          points[temp->date].next = temp;
          temp->last = &points[temp->date];
          temp = temp->next;
          if(temp != NULL)
           temp->last->next = NULL;
      }
      while(q->next != NULL)
          q = q->next;
      p->last->next = NULL;
      q->next = p;
      p->last = q;
    
    
    }
    void op3(int a, int b)
    {
      if(!find(a,b))
          return;
      struct point *temp = NULL;
      temp = q->next;
      while(temp  != NULL)
      {
          points[temp->date].next = temp;
          temp->last = &points[temp->date];
          temp = temp->next;
          if(temp != NULL)
          temp->last->next = NULL;
      }
      p->last->next = NULL;
      q->next = p;
      p->last = q;
    
    }
    void op4(int a,int b)
    {
       if(!find(a,b))
           return;
       while(q->next != NULL)
         q = q->next;    
        
      p->last->next = NULL;
      p->last = q;
      q->next = p;
      
    }
    void print()
    {
       int i = 0 ;
       for(i = 0 ;i < n; i ++)
       {
          printf("%d:",i);
          p = points[i].next;
          while(p != NULL)
          {
            printf(" %d",p->date);
            p = p->next;
          }
         printf("\n");
    
       }
    }
    int main(){
       while(scanf("%d",&n) != EOF)
    
        {
         memset(points,0,sizeof(points));
         for(int i = 0 ;i < n; i ++)
          {
              points[i].last =  NULL;
              points[i].date = -1;
              points[i].next = (point*)malloc(sizeof(point));
              points[i].next->date = i;
              points[i].next->last = &points[i];
              points[i].next->next = NULL;
          }
          while(1)
          {
            char tempa[100],tempb[100];
            int a,b;
            scanf("%s",tempa);
            if(tempa[0] == 'q')
                break;
    
            scanf("%d %s %d",&a,tempb,&b);
            if((a == b) || (a < 0 || a>= n) ||(b <0 || b >= n))
                continue;
            if(tempa[0] == 'm' && tempb[1] == 'n')
                op1(a,b);
            if(tempa[0] == 'm' && tempb[1] == 'v')
                op2(a,b);
            if(tempa[0] == 'p' && tempb[1] == 'n')
                op3(a,b);
            if(tempa[0] == 'p' && tempb[1] == 'v')
                op4(a,b);
          }
          print();
          free(p);
          free(q);
       }
      
    return 0;
    }
    没有梦想,何谈远方
  • 相关阅读:
    P3254 圆桌问题
    P4868 Preprefix sum
    2021sd省选游记
    P4145 上帝造题的七分钟2 / 花神游历各国
    P2801 教主的魔法
    P4147 玉蟾宫(悬线法)
    P1944 最长括号匹配
    CF1214D Treasure Island
    Loadrunner与kylinPET的能力对比测试--web动态请求
    Summer——从头开始写一个简易的Spring框架
  • 原文地址:https://www.cnblogs.com/zyue/p/3046306.html
Copyright © 2011-2022 走看看