码迷,mamicode.com
首页 > 其他好文 > 详细

hiho Mission Impossible 6(模拟 未提交验证。。)

时间:2015-09-20 22:19:21      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:

题意:模拟文本操作

思路:模拟

技术分享
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

#define MAXN 10005
int M;
char cmd[MAXN];
char str1[MAXN],str2[MAXN];
char copyStr[MAXN];

void f(){
    int i,j,k,len,len1,len2,lencp;
    len=strlen(cmd);//命令长度
    len1=len2=0;//文本长度
    lencp=0;//剪贴板长度
    int pos=0;//光标位置
    int mode=0;//0 "insert mode",1 "overwrite mode"
    int copyState=0;//0 "NOTHING",1 "START"
    int copyPosition1,copyPosition2;
    for(i=0;i<len;++i){
        if(cmd[i]>=a&&cmd[i]<=z){
            if(copyState==1)copyState=0;
            if(len1<M){
                if(pos==len1){
                    str1[len1++]=cmd[i];
                    str1[len1]=\0;
                    ++pos;
                }
                else{
                    if(mode==0){
                        for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                        str2[k++]=cmd[i];
                        for(j=pos;j<len1;++j)str2[k++]=str1[j];
                        str2[k]=\0;
                        strcpy(str1,str2);
                        ++len1;
                        ++pos;
                        //cout<<len1<<endl;
                        //cout<<str1[0]<<endl;
                    }
                    else{
                        for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                        str2[k++]=cmd[i];
                        for(j=pos+1;j<len1;++j)str2[k++]=str1[j];
                        str2[k]=\0;
                        strcpy(str1,str2);
                        ++pos;
                    }
                }
            }
        }
        else if(cmd[i]==L){
            if(pos>0)--pos;
        }
        else if(cmd[i]==R){
            if(pos<len1)++pos;
        }
        else if(cmd[i]==S){
            if(copyState==1)copyState=0;
            if(mode==0)mode=1;//变为重写
            else mode=0;//变为插入
        }
        else if(cmd[i]==D){
            if(copyState==1){
                copyState=0;
                copyPosition2=pos;
                if(copyPosition1<copyPosition2){
                    for(j=k=0;j<copyPosition1;++j)str2[k++]=str1[j];
                    for(j=copyPosition2;j<len1;++j)str2[k++]=str1[j];
                    str2[k++]=\0;
                    strcpy(str1,str2);
                    len1=len1-(copyPosition2-copyPosition1);
                }
                else{
                    for(j=k=0;j<copyPosition2;++j)str2[k++]=str1[j];
                    for(j=copyPosition1;j<len1;++j)str2[k++]=str1[j];
                    str2[k]=\0;
                    strcpy(str1,str2);
                    len1=len1-(copyPosition1-copyPosition2);
                }
            }
            else{
                if(pos<len1){
                    for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                    for(j=pos+1;j<len1;++j)str2[k++]=str1[j];
                    str2[k]=\0;
                    strcpy(str1,str2);
                    --len1;
                }
            }
        }
        else if(cmd[i]==B){
            if(copyState==1)copyState=0;
            if(pos>0){
                for(j=k=0;j<pos-1;++j)str2[k++]=str1[j];
                for(j=pos;j<len1;++j)str2[k++]=str1[j];
                str2[k]=\0;
                strcpy(str1,str2);
                --len1;
                --pos;
            }
        }
        else if(cmd[i]==C){
            if(copyState==0){
                copyState=1;
                copyPosition1=pos;
            }
            else{
                copyState=0;
                copyPosition2=pos;
                if(copyPosition1!=copyPosition2){
                    if(copyPosition1<copyPosition2){
                        for(j=copyPosition1,k=0;j<copyPosition2;++j)
                            copyStr[k++]=str1[j];
                        copyStr[k]=\0;
                        lencp=copyPosition2-copyPosition1;
                    }
                    else{
                        for(j=copyPosition2,k=0;j<copyPosition1;++j)
                            copyStr[k++]=str1[j];
                        copyStr[k]=\0;
                        lencp=copyPosition1-copyPosition2;
                    }
                }
                else{
                    memset(copyStr,\0,sizeof(copyStr));
                    lencp=0;
                }
            }
        }
        else if(cmd[i]==V){
            if(lencp>0){
                if(mode==0){
                    if(len1+lencp<=M){
                        for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                        for(j=0;j<lencp;++j)str2[k++]=copyStr[j];
                        for(j=pos;j<len1;++j)str2[k++]=str1[j];
                        str2[k]=\0;
                        strcpy(str1,str2);
                        len1=len1+lencp;
                        pos=pos+lencp;
                    }
                }
                else{
                    if(pos+lencp<=M){
                        for(j=k=0;j<pos;++j)str2[k++]=str1[j];
                        for(j=0;j<lencp;++j)str2[k++]=copyStr[j];
                        for(j=pos+lencp;j<len1;++j)str2[k++]=str1[j];
                        str2[k]=\0;
                        strcpy(str1,str2);
                        if(pos+lencp>len1)len1=pos+lencp;
                        pos=pos+lencp;
                    }
                }
            }
        }
    }
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&M);
        //M=100;
        scanf("%s",cmd);
        f();
        if(str1[0])printf("%s\n",str1);
        else printf("NOTHING\n");
    }
    return 0;
}
View Code

 

hiho Mission Impossible 6(模拟 未提交验证。。)

标签:

原文地址:http://www.cnblogs.com/bofengyu/p/4824256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!