模拟,入门级算法,顾名思义,就是让电脑按照题目所给出的方法来运行,最终输出所需要的结果的过程。
在这个算法中,需要注意到的有以下几点:
关于所使用的语言的是否熟悉(最为关键)
关于问题的分析思路是否最简
是否嫩在规定时间内模拟完整个过程并输出结果
关于问题的分析方法是否易于实现(关乎比赛时能否在规定时间内打完代码并调完bug)
对于特殊数据是否考虑周全
下面来看几个例题:
本题主要关注每个小人朝向内外状态与向左/右数的关系,一个显而易见的优化是当向一边数的人数si超过整个圈总人数n时,si=si%n
废话不多说,贴代码:
玩具谜题(NOIP2016 D1T1)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#define inputcheck 0
#define poscheck 1
using namespace std;
struct toy{
int dir;
string name;
}a[100001];
int n,m,pos=1;
void move(int t_dir,int t_mov)
{
if((a[pos].dir+t_dir)%2==0) {pos=pos+n-t_mov; return;}
if((a[pos].dir+t_dir)%2==1) pos=pos+t_mov;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i].dir>>a[i].name;
getchar();
}
int dir,num;
for(int i=1;i<=m;i++)
{
cin>>dir>>num;
move(dir,num);
while(pos<=0) pos=pos+n;
if(pos>n) pos=pos%n;
}
cout<<a[pos].name;
return 0;
}
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
const int N = 50;
using namespace std;
int map[N][N],n;
int main()
{
scanf("%d",&n);
map[1][(n+1)/2]=1;//行+列
int precol=1,prelin=(n+1)/2;//col:行 lin:列
for(int i=2;i<=n*n;i++)
{
//int nowcol,nowlin;
if(precol==1&&prelin!=n)
{
map[n][prelin+1]=i;
precol=n;
prelin+=1;
continue;
}
if(prelin==n&&precol!=1)
{
map[precol-1][1]=i;
precol-=1;
prelin=1;
continue;
}
if(precol==1&&prelin==n)
{
map[2][n]=i;
precol=2;
prelin=n;
continue;
}
else
{
if(!map[precol-1][prelin+1])
{
map[precol-1][prelin+1]=i;
precol=precol-1;
prelin=prelin+1;
continue;
}
else
{
map[precol+1][prelin]=i;
precol=precol+1;
continue;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d ",map[i][j]);
}
printf("\n");
}
return 0;
}