彩色项链

来源:互联网 发布:ov7670 51单片机引脚图 编辑:程序博客网 时间:2024/04/27 19:23

题目描述:

一条项链由N个珠子连接而成,编号依次为0, 1, 2, …, N-1。每个珠子的颜色用0~9之间的一位数字来表示(因此,可用的颜色一共有10种)。一条长度为4的项链如下图所示:(圆圈中的数字表示颜色,圆圈旁边的数字为珠子的编号)

 

现在有一台自动生产项链的机器,它的结构和工作方式如下所述:

机器的核心控制部件主要包括:一个CPU、一个整数寄存器START、和存储器S。

 

机器内部固化有一段程序,由CPU解释执行。该程序的输入是长度为N的十进制数字序列A,输出是另一个长度为N的十进制数字序列B。每次执行程序前将S初始化为输入序列A;程序结束后把S作为输出串B。START初始化为0。

程序包含M条指令,顺序编号为1~M。指令共有5种,以下是指令的格式和功能:(尖括号<>表示指令参数,都是整数)

 

编号

功能

格式

说明

1

设置寄存器

SETSTART <a> <b>

设置START的值:从S的第a位开始取连续b位得到的十进制整数(可能大于N-1)。

0<=a<=N-1,1<=b<=min(8, N)

2

循环移位

SHIFT <L> <x>

把S从第START位开始的连续L 位,循环移位|x|位。x>0时右移,x<0时左移。

2<=L<=min(10, N),1<=|x|<=L-1

3

乘法

MUL <L> <x>

把S从第START位开始的连续L位当做原始串(L位十进制整数),将其乘以x以后保留结果的最低L位,替换原始串。

1<=x<=9,1<=L<=min(10, N)

4

条件

ONDIGIT <x> <y> <z>

如果S的第x位等于y,则跳转到第z条指令。

0<=x<=N-1,0<=y<=9,1<=z<=M。z大于当前指令序号, 即不会往回跳转。

5

终止

END

仅作为最后一条语句出现,程序终止。

 

由于项链是环型的,因此第i位和第i+kN位(k为整数)代表数字序列的同一位置。例如当N=4时,第6位和第2位是等价的。

 

下面是一个程序的例子:

MUL 3 2

SETSTART 2 1

ONDIGIT 0 4 1

SHIFT 3 –2

END

 

机器启动的时候,输入一个数字串S0,执行程序得到一个新的数字序列S1并生产出S1代表的项链来,以后机器每生产出一条新项链Sn,就把Sn对应的数字序列作为输入重新执行一遍程序,得到一个新的数字序列Sn+1并生产出新的项链。

由于长度为N的项链种类数目是有限的(至多10N种不同的项链),因此如果让机器一直工作下去,某些种类的项链会被生产出无限多条。编程计算出这些将被无限生产出的项链有多少种。在本题中,可以被生产出来的项链种类总数保证不超过106

大致思路:

考查的是floyd判圈算法。大概的意思是,两个小孩一起跑步,一个的速度是另一个的两倍。如果快的追上慢的,那么有圈。

代码示例:

#include<stdio.h> /* Parameters:  .in  .out .ans Eval:  -first line:  score  -second line: message*/ void main(int argc, char * argv[]){         FILE*out, *ans, *eval;         intscore;         intans1, ans2;          out= fopen(argv[1], "r");         ans= fopen(argv[2], "r");         eval= fopen("/tmp/_eval.score", "w");         if(out== NULL){                   fprintf(eval,"0\nOutput file not found!\n");                   fclose(eval);         }else{                   fscanf(out,"%d", &ans1);                   fscanf(ans,"%d", &ans2);                   if(ans1== ans2)                            fprintf(eval,"10\nCorrect!\n");                   else                            fprintf(eval,"0\nWrong Answer!");                   fclose(eval);         }       fclose(out);       fclose(ans);}


注:这是某年IOI的题目~~~~~~代码不是我自己写的,是某大神给的标程代码……

0 0