zoukankan      html  css  js  c++  java
  • POJ 1026 Cipher(群置换) (待解决)

    题目链接:http://poj.org/problem?id=1026

    题目大意:

    给出1~n的置换序列, 然后给出一个整数k,和一个串

    问置换k次后的串是什么样子的。

    首先,给出的串的长度是小于等于n的,不足的位置要补上空格。

    然后置换k次,不是直接就循环着置换,因为置换内的每个循环都是有一定长度的,如果超过这个长度的置换次数,必然会和前面的某个状态一样,所以对每个循环,如果长度为len,循环内的元素只需要置换k%len次即可。

    开始用的结构体排序,结果果断超时

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cmath>
    using namespace std;
    
    struct TT{
    	int num;
    	char ch;
    }
    seq[210];
    
    bool cmp(TT a ,TT b ){
    	return a.num<b.num;
    }
    
    int main()
    {
        while(1){
    	int i,n,sseq[210];
    	scanf("%d",&n);
    	for(i=0;i<n;i++){
              //  cout<<"..............."<<endl;
    		scanf("%d",&seq[i].num);//输入次序
    		sseq[i]=seq[i].num;
    	}
       if(n==0)
            break;
    	int k;
    	while(cin>>k){//~scanf("%d",&k)){
            if(k==0)
                break;
    	char a[210],b[210],aaa;
    	int j;
    	memset(a,' ',sizeof(a));
    	scanf("%c",&aaa);
    	gets(a);
    	if(strlen(a)<n)
    		a[strlen(a)]=' ';
    	for(j=0;j<n;j++)
    		seq[j].ch=a[j];
    	while(k--){///执行完之后k到底是多少
    		sort(seq,seq+n,cmp);
    		for(i=0;i<n;i++)
    			seq[i].num=sseq[i];
    	}
    	for(i=0;i<n;i++)
              	printf("%c",seq[i].ch);
             printf("
    ");
    	}
        }
        return 0;
    }

    修改的代码(未完成)

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cmath>
    using namespace std;
    
    int main()
    {
        while(1){
    	int i,n,seq[210],test[210],testsq[210];
    	scanf("%d",&n);
    	for(i=0;i<n;i++){
    		scanf("%d",&seq[i]);///输入次序
    		testsq[i]=--seq[i];
    	}
       if(n==0)
            break;
    	int k;
    	while(cin>>k){//~scanf("%d",&k)){
            if(k==0)
                break;
    		char a[210],aaa,testch[210];
    		int j;
    		memset(a,' ',sizeof(a));
    		scanf("%c",&aaa); ///收取空格
    		gets(a);
    		if(strlen(a)<n)
    			a[strlen(a)]=' ';
    
    		for(i=0;i<n;i++)
            {
                int ccount=1;
               int  road[210];
               int aa=testsq[seq[i]];
               testsq[seq[i]]=seq[i];
                cout<<"***************************************"<<endl;
                while(1)    ///查找周期
                {
                    if(aa==testsq[seq[i]])///两次相同的话
                       break;
                    aa=seq[aa];
                    testsq[seq[i]]=seq[i];
                    road[i]=seq[i];
                    ccount++;
                }
                int temp=road[k%ccount];
                testch[temp]=a[i];
            }
    		for(i=0;i<n;i++)
    			printf("%c",testch[i]);
            printf("
    ");
    	}
        }
        return 0;
    }


     

  • 相关阅读:
    2019 学霸君java面试笔试题 (含面试题解析)
    2019 大众书网Java面试笔试题 (含面试题解析)
    2019 中细软java面试笔试题 (含面试题解析)
    2019 企叮咚java面试笔试题 (含面试题解析)
    js 去掉数组对象中的重复对象
    canvas霓虹雨
    nvm的安装
    socket.io 中文文档
    Nginx(三)------nginx 反向代理
    github入门到上传本地项目
  • 原文地址:https://www.cnblogs.com/zswbky/p/5432032.html
Copyright © 2011-2022 走看看