基礎算法學習之模擬

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

T2.神奇的幻方(NOIP2015 D1T1)

#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;
}
發佈了37 篇原創文章 · 獲贊 14 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章