模拟算法
准确的定义:
模拟整个过程,通过改变数学中模型的各种参数,进而观察变更这些参数所引起过程状态的变化。
我的理解:
所谓模拟,即使程序完整的按题目所叙述的方式运行,最终得出答案。
1、For循环练习题
|
九九乘法表 样例输出: |
#include<stdio.h>
void main()
{
for(int a=1;a<10;a++)
{
for(int b=1;b<=a;b++)
printf("%d*%d=%d ",b,a,a*b);
printf("\n");
}
}
2、Transformations
方块转换
译by TinyTony
一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始
图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。
PROGRAM NAME: transform
INPUT FORMAT
|
第一行: |
单独的一个整数N。 |
|
第二行到第N+1行: |
N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。 |
|
第N+2行到第2*N+1行: |
N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。 |
SAMPLE INPUT(file transform.in)
3
@-@
---
@@-
@-@
@--
--@
OUTPUT FORMAT
单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的
转换方法。
SAMPLE OUTPUT (file transform.out)
1思路:
我没有采用最常规的方法,
最常规的方法是:将a,b数组中字符按规律逐个比较,每个对应一个函数,如果完全一致则输出的#x,
这种方法写的程序往往看上去长而且乱,故我没有采用
我的方法是:将a,b数组中的字符逐个比较,但不写函数,而是记录下相同字符的个数,如果相同字符个数等于总个数,说明它们完全相同,则输出对应的#x。
#include<stdio.h>
char a[11][11]={0};
char b[11][11]={0};
int n[11]={0};
int N;
void compare()
{
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
if(a[j][N-1-i]=b[i][j])
n[1]++;
if(a[N-1-i][N-1-j]=b[i][j])
n[2]++;
if(a[N-1-j][i]=b[i][j])
n[3]++;
if(a[i][N-1-j]=b[i][j])
n[4]++;
if(a[N-1-j][N-1-i]=b[i][j])
n[5]++;
if(a[N-1-i][j]=b[i][j])
n[8]++;
if(a[j][i]=b[i][j])
n[9]++;
if(a[i][j]=b[i][j])
n[6]++;
}
for(i=1;i<10;i++)
{
if(n[i]==N*N&&i!=8&&i!=9)
{
printf("%d\n",i);
break;
}
else if(n[i]==N*N&&i==8||i==9)
{
printf("5\n");
break;
}
else
{
printf("7\n");
break;
}
}
}
void main()
{
int i;
scanf("%d",&N);
getchar();
for(i=0;i<N;i++)
{
for(int j=0;j<N;j++)
scanf("%c",&a[i][j]);
getchar();
}
for(i=0;i<N;i++)
{
for(int j=0;j<N;j++)
scanf("%c",&b[i][j]);
getchar();
}
compare();
}
3、RunaroundNumbers
循环数
译 by Henry HuGang
循环数是那些不包括0这个数字的没有重复数字的整数 (比如说,
81362) 并且同时具有一个有趣的性质, 就像这个例子:
· 如果你从最左边的数字开始 ( 在这个例子中是8) 数最左边这个数字个数字到右边(回到最左边如果数到了最右边),你会停止在另一个新的数字(如果没有停在一个不同的数字上,这个数就不是循环数). 就像:
8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6.
· ==0){flag[a[k]]=1; k=(k-(a[k]%len)+len)%len;}elseflag1=1;}if(flag1==0)yes=1;else yes=0;}void main(){ int M,m; scanf("%d",&M); //M=34567; m=M-1; while(yes==0) { m++; find(m); } printf("%d\n",m);}重复这样做 (这次从“6”开始数6个数字) 并且你会停止在一个新的数字上:
2 8 1 3 6 2, 也就是2.
· 再这样做 (这次数两个): 8 1
· 再一次 (这次一个): 3
· 又一次: 6 2 8 这是你回到了起点, 在从每一个数字开始数1次之后. 如果你在从每一个数字开始数一次以后没有回到起点, 你的数字不是一个循环数。
给你一个数字 M (在1到8位之间), 找出第一个比 M大的循环数。
PROGRAM NAME: runround
INPUT FORMAT
仅仅一行, 包括M
SAMPLE INPUT (file runround.in)
81361
OUTPUT FORMAT
仅仅一行,包括第一个比M大的循环数。
SAMPLE OUTPUT (file runround.out)
81362
附样例2:
输入:
34567
输出:
34792
#include<stdio.h>
int a[100]={0};
int yes=0;
void find(int m)
{
int m1=m,len=0,flag1=0;
int flag[100]={0};
for(int i=0;m1>0;i++)
{
a[i]=m1%10;
if(a[i]==0)
{
flag1=1;
break;
}
m1=m1/10;
len++;
}
int k=len-1;
for(i=0;i<len&&flag1==0;i++)
{
// printf("flag:%d %d\n",flag[a[k]],a[k]);
if(flag[a[k]]==0)
{
flag[a[k]]=1;
k=(k-(a[k]%len)+len)%len;
}
else
flag1=1;
}
if(flag1==0)
yes=1;
else
yes=0;
}
void main()
{
int M,m;
scanf("%d",&M);
//M=34567;
m=M-1;
while(yes==0)
{
m++;
find(m);
}
printf("%d\n",m);
}
本文详细介绍了ACM暑期培训中的模拟算法应用,包括99乘法表、方块转换和循环数问题的解决策略。针对方块转换,提出了一种非传统的方法,通过比较字符个数判断是否相同;对于循环数问题,给出了寻找下一个循环数的算法流程。
&spm=1001.2101.3001.5002&articleId=7769112&d=1&t=3&u=c46648bf556a4a609f9457c513f82ea9)
1万+

被折叠的 条评论
为什么被折叠?



