Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

我的代码,一直RE,从Java到C都是,实在疯了,那位大牛能帮我看看么,太谢谢了

Posted by liuyuyangfoam at 2005-12-23 00:05:28 on Problem 1026
// 1026 Cipher
#include <stdio.h>
#include <string.h>

void encryptKtimes(int n,int k);
void getCyc(int n);
/*
void printKey(int n);
void printCyc(int n);
*/
int key[2000];
int cyc[2000];
char message[2000];
int cycnum = 0;

int main() 
{		
	int n,k,len; // 0 < n <= 200
	
	while (1) 
	{
		scanf("%d",&n);		
		if (0==n) break;
		
		for (int i=0;i<n;i++) {
			scanf("%d",&key[i]);
			key[i]--;
		}		
		getCyc(n);
		//printCyc(n);
		
		while(1)
		{
			scanf("%d",&k);		
			if (0==k) break;			
			getchar(); // 掠过那个空格
			// 假设message长度为len(len<=n),在0-(len-1)被填充为字符,len填充为0.	
			gets(message);		
			len = strlen(message);
			// 把len-(n-1)这(n-len)这字符设置为空格.
			if (len<=n) memset(message+len,' ',n-len);
			message[n]=0;  // 最后nth位置设为0以便输出.
//printf("c:%c length:%d\n",message[0],strlen(message));			
			encryptKtimes(n,k);	// 编码k次
			printf("%s\n",message);				
		}			
	}
	return 0;	
}
	
void encryptKtimes(int n,int k) {
	int i,j,jj,times;
	char ch1,ch2;
	for(i=1;i<=cycnum;i++) {
		// 求此轮换长度和第一个数的位置
		int length = 0;
		int pos = 0;
		for(j=n-1;j>=0;j--) {
			if (cyc[j]==i) {
				length++;
				pos = j;
			}
		}
			
		times = k % length; // 实际需要做多少次
//printf("k:%d\n",k);
			
		for (j=0;j<times;j++) {			
			ch1 = message[pos];
			ch2=message[key[pos]];			
			for (jj=0;jj<length;jj++) {	
//printf("ch1:%c ch2:%c\n",ch1,ch2);				
				message[key[pos]] = ch1;										
				pos = key[pos];			
				ch1 = ch2;		
				ch2 = message[key[pos]];
//printf("message:%s\n",message);				
			}				
		}			
	}		
}
	
// key = {4 5 3 7 2 8 1 6 10 9}时
// cyc = 1231241455	
void getCyc(int n) {
	memset(cyc,0,n); // 初始化
	int count = 0;	// 处理了多少个数
	int num = 0; 	// 一共有多少个轮换
	int pos = 0;
	do {	
		pos = 0;
		while (cyc[pos]!=0)pos++;	
		num++;
		while (cyc[pos]==0) {
			count++;
			cyc[pos] = num;
			pos = key[pos];
		}
	} while(count<n);	
	cycnum = num;	// 上面这个例子的话会返回5.
}
/*
// for test	
void printKey(int n) {
	for (int i=0;i<n;i++) {
		printf("%d ",key[i]);
	}
	printf("\n");
}

void printCyc(int n) {
	for (int i=0;i<n;i++) {
		printf("%d ",cyc[i]);
	}
	printf("\n");
}
*/

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator