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;
}