算法(一)模拟

一、概述

1、概念

模拟:就是按照题目给的操作,理清思路用代码依次描述出来即可

2、解题思路

基本上是送分题,所以大家只要有一定的代码基础就可以拿到满分,所以针对这一块,我们只需要多打打代码即可。

二、例题

1、金币

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    scanf("%d",&n);		//n为剩下的能增加金币的天数
    int add=1;          //最多连续n天每天给n个金币	
    int ans=0;
    while(n>0){
        if(n>=add){       //时间够多
            n-=add;         
            ans+=add*add;
        }else{				//时间不够多,金币增加天数为n
            ans+=add*n;
            n-=add;         
        }
        add++;          	//金币数增加
    }
    printf("%d",ans);
    return 0;
}

2、神奇的幻方

由题可知下一个点的位置取决于上的点的位置,依题意判断即可

https://blog.youkuaiyun.com/cggwz/article/details/77133268

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    scanf("%d",&n);
    int num[n][n];
    memset(num,0,sizeof(num));
    num[0][n/2]=1;
    int x=0,y=n/2;
    //由题可知下一个点的位置取决于上的点的位置,依题意判断即可
    for(int i=2;i<=n*n;i++){
        if(x==0&&y!=n-1){
            x=n-1;
            y++;
        }else if(x!=0&&y==n-1){
            y=0;
            x--;
        }else if(x==0&&y==n-1){
            x++;
        }else if(num[x-1][y+1]==0){
            x--;
            y++;
        }else{
            x++;
        }
        num[x][y]=i;
    }
    //输出,注意多了空格或多了\n均会判错??
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            printf("%d",num[i][j]);
            if(j!=n-1){
                printf(" ");
            }
        }
        if(i!=n-1)
        	printf("\n");
    }
    return 0;
}

3、玩具谜题

https://blog.youkuaiyun.com/cggwz/article/details/77280534

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    int dirt[n];
    char name[n][20];
    for(int i=0;i<n;i++){
        char x;
        scanf("%d",&dirt[i]);
        scanf("%c",&x);       //1
        scanf("%s",name[i]);
    }
    int cur=0;                //2
    for(int i=0;i<m;i++){
        int a,b;
        scanf("%d%d",&a,&b);
        if(a+dirt[cur]==1){      //判定下标要加还是减(画图)
            cur+=b;
        }else{
            cur-=b;
        }
        if(cur<0){              //防止越界,也可用取余
            cur+=n;
        }else if(cur>=n){
            cur-=n;
        }
    }
    printf("%s",name[cur]);
    return 0;
}

1处:这是为了把数字与名字之间的空格读入扔掉,为以后输出省了一点事(好像更麻烦了?无所谓,你自己抉择。)
2处:cur代表当前走到哪个小人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值