Skip to content

A 方块转换

一道较为耗时的模拟题 对于目前完全超纲的 目的给那些初高中有编程基础的

c++
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=12;
int n;
struct Matrix
{
    int a[maxn][maxn];
    void in(){for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf(" %c",a[i]+j);}
    Matrix rotate()
    {
        Matrix ans;
        for(int i=0;i<n;i++)for(int j=0;j<n;j++)ans.a[i][j]=a[n-j-1][i];
        return ans;
    }
    Matrix reflex()
    {
        Matrix ans;
        for(int i=0;i<n;i++)for(int j=0;j<n;j++)ans.a[i][j]=a[i][n-j-1];
        return ans;
    }
    bool operator==(Matrix b)//判断两个矩阵是否相等
    {
        for(int i=0;i<n;i++)for(int j=0;j<n;j++)
        if(a[i][j]!=b.a[i][j])return false;
        return true;
    }
}from,to,mid;
int main()
{
    scanf("%d",&n);
    from.in();to.in();
    mid=from;
    for(int i=1;i<=3;i++)
    {
        mid=mid.rotate();
        if(mid==to){printf("%d\n",i);return 0;}
    }
    mid=from.reflex();
    if(mid==to){printf("4\n");return 0;}
    for(int i=1;i<=3;i++)
    {
        mid=mid.rotate();
        if(mid==to){printf("5\n");return 0;}
    }
    if(from==to){printf("6\n");return 0;}
    printf("7\n");//这些数字的顺序很重要
    return 0;
}

B 统计子串个数

就拿着子串t与s里的比较 如果相同count++

c++
#include<iostream>
using namespace std;
int count , pos ,len_s ,len_t ;
string s , t; //string 就是一个字符数组 等于 char s[] , char t[]
signed main()
{
    cin >> s >> t;  //输入

    len_s = s.size();   //s串的长度
    len_t = t.size();   //t串的长度

    for(int i = 0 ; i < len_s ; i ++)   //从 0 ~ n 遍历 s
    {                                      
        if(s[i] == t[0])    //如果遍历到的字符s[i] 与 目标串t的t[0]相等开始判断
        {
            int flag = 1;   //标记  如果不是子串 flag = 0
            for(int j = i ; j < i + len_t ; j ++)
            {
                if(s[j] != t[j-i]) //如果在判断中有不相同的就不是子串
                    flag = 0;   //标记
            }
            if(flag)    //如果循环走完了都是相同flag=1就count++
            {
                i += len_t;// i 到 i+len_t已经遍历过了 直接跳过来
                count ++;
            }
        }
    }
    cout << count; //输出答案 printf也可
    return 0;
}

C 卐

有两种做法 可以找二维字符数组是否画点与下标(i,j)的关系 也可以模拟跟着图形画

c++
#include<stdio.h>
#include<string.h>
char A[500][500];
int main()
{
	int a;
	scanf("%d",&a);
	int b=2*a+1;
	int i,j;
	for(i=0;i<b;i++)
	    for(j=0;j<b;j++)
	        A[i][j]=' ';
	
	for(i=0;i<b;i++)
    {
		A[a][i]='.';
		A[i][a]='.';
	}
	for(i=0;i<a;i++)
    {
		A[0][i+a+1]='.';
		A[i][0]='.';
		A[i+a+1][b-1]='.';
		A[b-1][i]='.';
	}
	for(i=0;i<b;i++)
    {
	    for(j=0;j<b;j++)
	        printf("%c",A[i][j]);
	    printf("\n");
    }
}

D 可爱的小鱼

两层循环 第一层i枚举数组元素 第二层j枚举到i判断 下标i,j 大小 在第二层循环结束了并输出答案

c++
#include<stdio.h>
int arr[1010];
int n , count;
int main()
{
    scanf("%d",&n);
    for (int i = 0; i <n; i++)
        scanf("%d",&arr[i]);

    for (int i = 0; i <n; i++)
    {
        if(i-1>=0)
            for(int j = i-1; j >= 0; j--)
                if(arr[j]<arr[i])
                    count++;

        printf("%d ",count);
        count=0;    //重置为0 
    }
    return 0;
}

E 蛇形数组

跟着模拟即可 小知识点:方向数组dx dy

c++
#include<cstdio>
const int N = 30;
const int dx[] = {0,-1,0,1}; //方向 : 左 上 右 下
const int dy[] = {-1,0,1,0};
int mp[N][N] , n , num , x , y ,direction; //direction存储对映在dx dy 的下标

signed main()
{
    scanf("%d",&n);
    num = n * n; // 记录放在右下角的数字
    x = n;
    y = n;//刚开始的位置 (x,y)
    mp[x][y] = num --;//存入
    while(num)//num每次减一 num==0 时循环停止
    {
        int nx = x + dx[direction]; //将要放入元素的位置 (nx,ny)
        int ny = y + dy[direction];

        if(nx >= 1 && nx <= n && ny >= 1 && ny <= n && !mp[nx][ny]  ) //判断(nx,ny)越界 判断里面是否已经放入了元素
            mp[(x = nx)][(y = ny)] = num --;    //放入
        else
            direction = (direction + 1) % 4;   //如果越界或者有元素了就转向
    }

    for(int i = 1 ; i <= n ; i ++)  //输出
    {
        for(int j = 1 ; j <= n ; j ++)
            printf("%-4d",mp[i][j]);
        printf("\n");
    }
}

F 打分

一个sum记录全部累加 一个max记录数组中的最大值 另一个min记录最小值

c++
#include<cstdio>
#include<cmath>
signed main()
{
    int n;
    scanf("%d",&n);
    int sum = 0;
    int max = -2e9 , min = 2e9;
    for(int i = 1 ; i <= n ; i ++)
    {
        int x;
        scanf("%d",&x);
        if(x > max)
            max = x;
        if(x < min)
            min = x;
        sum += x;
    }
    double ans = (double)(sum - max - min) / (n - 2);
    printf("%.2lf",ans);
    return 0;
}

G 数字反转

字符数组逆序输出即可

c++
#include<bits/stdc++.h>
using namespace std;
signed main()
{
    string s;
    cin >> s;
    for(int i = s.size() - 1 ; i >= 0 ; i --)
        cout << s[i];
    return 0;
}

H 皮卡丘的梦幻之旅(easy version)

这道题有点难度 需要算法 写不出没关系 但是看到有人快写出来还是蛮不错的 搜索(DFS)

c++
#include<iostream>
const int N=20;
int res;
int a[4];
int n,m;
void dfs(int now)
{
    if(now >= n)
    {
        if(now == n) 
            res ++;
        return ;
    }
    for(int i = 1 ; i <= m ; i ++)
        dfs(now + a[i]);
    
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i = 1 ; i <= m ; i ++) 
        scanf("%d",&a[i]);

    dfs(0);
    printf("%d\n",res);
}

方法二:DP

c++
#include<iostream>
using namespace std;

const int INF=0x3f3f3f3f,mod=998244353;
const int N=5003,M=5003;
int a[M];
int dp[N];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%d",&a[i]);
    dp[0]=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(i>=a[j]) 
                dp[i]=(dp[i]+dp[i-a[j]])%mod;
    printf("%d\n",dp[n]);
}

I 绝对值求和

直接求 但是注意是实数 所以开double

c++
#include<cstdio>
#include<cmath>
signed main()
{
    double a , b;
    scanf("%lf%lf",&a,&b);
    printf("%.1lf\n",fabs(a)+fabs(b));
}

或者

c++
#include<cstdio>
#include<cmath>
signed main()
{
    double a , b;
    scanf("%lf%lf",&a,&b);
    printf("%.1lf\n",(a > 0 ? a : (-1)*a) + (b > 0 ? b : (-1) *b));
}

J deduplicate

一个简单的数组去重 但是要注意 他不是有序的 样例容易误导人

c++
#include <stdio.h>
int a[10010],l,i,n;

int main()
{
    scanf("%d",&n);
    while(n)
    {
        scanf("%d",a+l);
        for(i=0;i<l;i++)
            if(a[i]==a[l])
                break;
        if(i>=l)
            l++;
        n--;
    }

    for(i=0;i<l;i++)
        printf("%d\n",a[i]);

    return 0;
}

或者开一个状态数组st记录是否出现过

c++
#include<bits/stdc++.h>
int arr[10010],n;
bool st[10010];

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&arr[i]);
        if(!st[arr[i]])
            printf("%d\n",arr[i]);
        st[arr[i]] = true;
    }

    return 0;
}

K 简单A+B

无需多言

c++
#include<bits/stdc++.h>
int main()
{
    int a , b;
    std::cin >> a >> b;
    std::cout << (a + b) ;
    return 0;
}

或者你可以模拟人工计算

c++
#include <iostream> 
#include <cmath>
using namespace std;
int fu=1,f=1,a,b,c=0;
int main()
{
    cin>>a>>b;
    if(a<0&&b>0)fu=2;
    if(a>0&&b<0)fu=3;
    if(a<0&&b<0)f=-1;
    if(a==0){cout<<b;return 0;}
    if(b==0){cout<<a;return 0;} 
    a=abs(a);
    b=abs(b);
    if(a>b&&fu==3)f=1;
    if(b>a&&fu==3)f=-1;
    if(b>a&&fu==2)f=1;
    if(b<a&&fu==2)f=-1;
    if(fu==1)c=a+b;
    if(fu>1)c=max(a,b)-min(a,b);
    c*=f;
    cout<<c;
    return 0;
}

Released under the MIT License.