模擬,入門級算法,顧名思義,就是讓電腦按照題目所給出的方法來運行,最終輸出所需要的結果的過程。
在這個算法中,需要注意到的有以下幾點:
關於所使用的語言的是否熟悉(最爲關鍵)
關於問題的分析思路是否最簡
是否嫩在規定時間內模擬完整個過程並輸出結果
關於問題的分析方法是否易於實現(關乎比賽時能否在規定時間內打完代碼並調完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;
}