天天看点

模拟算法模拟算法

模拟算法

eg1:for循环练习题

九九乘法表

输出格式整齐的九九乘法表

样例输出:

1x1=1

1x2=2  2x2=4

1x3=3  2x3=6  3x3=9

1x4=4  2x4=8  3x4=12 4x4=16

1x5=5  2x5=10 3x5=15 4x5=20 5x5=25

1x6=6  2x6=12 3x6=18 4x6=24 5x6=30 6x6=36

1x7=7  2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49

1x8=8  2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64

1x9=9  2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

#include<stdio.h>

int main()

{

int i,j;

for(i=1;i<=9;i++)

{

for(j=1;j<=i;j++)

printf("%d×%d=%d  ",j,i,i*j);

printf("\n");

}

return 0;

}

eg2:方块转换

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

#1:转90度:图案按顺时针转90度。

#2:转180度:图案按顺时针转180度。

#3:转270度:图案按顺时针转270度。

#4:反射:图案在水平方向翻转(形成原图案的镜像)。

#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。

#6:不改变:原图案不改变。

#7:无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

INPUT FORMAT

第一行: 单独的一个整数N。
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
第N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。

SAMPLE INPUT 

3

@[email protected]

---

@@-

@[email protected]

@--

[email protected]

OUTPUT FORMAT

单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的

转换方法。

SAMPLE OUTPUT 

1

#include<stdio.h>

int N;

char b[11][11];

int way1(char a[11][11])

{

int i,j,flag=1;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[j][N-i-1])

     return 0;

return 1;

}

int way2(char a[11][11])

{

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[N-i-1][N-j-1])

return 0;

return 1;

}

int way3(char a[11][11])

{

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[N-j-1][i])

return 0;

return 1;

}

int way4(char a[11][11])

{

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[i][N-j-1])

     return 0;

return 1;

}

int way5(char a[11][11])

{

char c[11][11];

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

c[i][j]=a[i][N-j-1];

if(way1(c)||way2(c)||way3(c))

return 1;

else 

return 0;

}

int way6(char a[11][11])

{

int i,j;

for(i=0;i<N;i++)

for(j=0;j<N;j++)

if(a[i][j]!=b[i][j])

return 0;

return 1;

}

int main()

{

int i;

char a[11][11];

scanf("%d",&N);

for(i=0;i<N;i++)

{

        scanf("%s",&a[i]);

    getchar();

}

for(i=0;i<N;i++)

{

scanf("%s",&b[i]);

getchar();

}

if(way1(a))

printf("1\n");

else if(way2(a))

printf("2\n");

else if(way3(a))

printf("3\n");

else if(way4(a))

printf("4\n");

else if(way5(a))

printf("5\n");

else if(way6(a))

printf("6\n");

else

printf("7\n");

return 0;

}

eg3:循环数

循环数是那些不包括0这个数字的没有重复数字的整数 (比如说, 81362) 并且同时具有一个有趣的性质, 就像这个例子:      

· 如果你从最左边的数字开始(在这个例子中是8) 数最左边这个数字个数字到右边(回到最左边如果数到了最右边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数). 就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6.

· 重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2.

· 再这样做 (这次数两个): 8 1

· 再一次 (这次一个): 3

· 又一次: 6 2 8 这是你回到了起点, 再从每一个数字开始数1次之后. 如果你在从每一个数字开始数一次以后没有回到起点, 你的数字不是一个循环数。

给你一个数字 M (在1到8位之间), 找出第一个比 M大的循环数。

INPUT FORMAT

仅仅一行, 包括M

SAMPLE INPUT 

81361

OUTPUT FORMAT

仅仅一行,包括第一个比M大的循环数。

SAMPLE OUTPUT 

81362

附样例2:

输入:

34567

输出:

34793

#include<stdio.h>

int count=0,len;

int a[8];

int number(int num)

{

int b[8],i=0,j;

while(num)

{

b[i]=num%10;

num=num/10;

i++;

}

len=i;

for(i--,j=0;i>=0;i--,j++)

a[j]=b[i];

return 0;

}

int repeat()

{

int i,j;

for(i=0;i<len;i++)

for(j=i+1;j<len;j++)

if(a[i]==a[j]||a[i]==0)

return 0;

return 1;

}

int cycle(int i)

{

int j;

if(a[i]!=0)

{

j=(i+a[i])%len;

     a[i]=0;

count++;

i=j;

cycle(i);

}

if(count==len)

return 1;

return 0;

}

int main()

{

int num,ans;

scanf("%d",&num);

num=num+1;

ans=num;

number(num);

for(;!cycle(0);num++)

    ans=num;

    count=0;

number(num);

while(!repeat())

number(num++);

}

printf("%d\n",ans);

return 0;

}

继续阅读