01走迷宫(bfs+路径打印)
#include <iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef pair<int,int> PII;
#define x first
#define y second
const int N=60;
int n,m;char a[35][55];
int d[35][55]; //表示从该点到终点的距离 ,以便后续路径打印
int dx[]={1,0,0,-1},dy[]={0,-1,1,0}; //题目中最小扫描顺序 :下,左,右,上
char dir[]={'D','L','R','U'};
void bfs()
{
memset(d,-1,sizeof d);
queue<PII> q;
q.push({30,50});
d[30][50]=0;
while(q.size())
{
auto t=q.front();
q.pop();
for(int i=0;i<4;i++)
{
int x=t.x+dx[i],y=t.y+dy[i];
if(x>=1&&x<=30&&y>=1&&y<=50&&a[x][y]=='0'&&d[x][y]==-1)
{ d[x][y]=d[t.x][t.y]+1;
q.push({x,y});
}
}
}
}
int main()
{
for(int i=1;i<=30;i++)
for(int j=1;j<=50;j++)
cin>>a[i][j];
bfs(); //将每个点到终点的距离初始化
int x=1,y=1;
string res;
while(x!=30||y!=50)
{
for(int i=0;i<4;i++)
{
int kx=x+dx[i];int ky=y+dy[i];
if(kx>=1&&kx<=30&&ky>=1&&ky<=50&&a[kx][ky]=='0'&&d[kx][ky]==d[x][y]-1)
{ res+=dir[i];
x=kx,y=ky;
break;
}
}
}
cout<<res<<endl;
return 0;
}
02单词分析(统计字符串次数)
#include <bits/stdc++.h>
using namespace std;
int ma,ch;
int cnt[30]; //存储26个字母中每个字母的数量,
int main()
{
string s;
cin>>s;
for(auto i:s) cnt[i-'a']++; // for(auto i:s)表示将s中每个字符串传给变量i
for(int i=0;i<26;i++)
if(ma<cnt[i]) ma=cnt[i],ch=i;
cout<<char(ch+'a')<<endl; //记得转化为char类型
cout<<ma<<endl;
return 0;
}
-----------------------------------
03 计算9进制2022 转为10进制
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout<<2*pow(9,3)+2*pow(9,1)+2*pow(9,0)<<endl;
}
04 求和(前缀和)
#include <iostream>
using namespace std;
const int N=2e5+5;
int a[N];
typedef long long ll;
ll s[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
s[1]=a[1];
for(int i=2;i<=n;i++) s[i]=s[i-1]+a[i];
ll res=0;
for(int i=1;i<=n;i++)
{
res+=a[i]*(s[n]-s[i]);
}
cout<<res<<endl;
return 0;
}
05 成绩统计(setprecision保留小数)
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double n,good,best,score;
cin>>n;
for(int i=0;i<n;i++){
cin>>score;
if(score>=60)
{
good++;
}
if(score>=85){
best++;
}
}
double a=(good/n)*100.0;
double b=(best/n)*100.0;
cout << fixed << setprecision(0) << a <<"%" << endl ;
cout << fixed << setprecision(0) << b << "%" << endl;
return 0;
}
06 门派制作(取出整数中每一位的数字)
#include <iostream>
using namespace std;
int main()
{
int res=0;
for(int i=1;i<=2020;i++)
{
if(i/1000==2) res++;
if(i/100%10==2) res++;
if(i%100/10==2) res++;
if(i%100%10==2) res++ ;
}
cout<<res<<endl;
return 0;
}
07 跑步锻炼
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22
千米。如果同时是周一或月初,小蓝也是跑 22 千米。小蓝跑步已经坚持了很长时间,从 20002000 年 11 月
日周六(含)到 20202020 年 1010 月 11 日周四(含)。请问这段时间小蓝总共跑步多少千米?
#include <iostream>
using namespace std;
//依次判断年月日周
int main(){
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int ans=6;//一月一号是周六
int cnt=0;//公里数
for(int year=2000;year<=2020;year++){
if(year%4==0&&year%100!=0||year%400==0){
months[2]=29;
}else{
months[2]=28;
}
for(int month=1;month<=12;month++){//几月
for(int day=1;day<=months[month];day++){//几日
cnt++;//每天一千米
if(ans==8){
ans=1;//ans自增到 8 时归回 1
}
if(ans==1||day==1){//或意味着A对,B对,AB同时对三种情况
cnt++;//周一或月初或周一与月初多跑一千米
}
ans++;//进入第二天
if(year==2020&&month==10&&day==1){//到2020.10.1结束循环
printf("%d",cnt);
}
}
}
}
return 0;//一点一点来不要怕错
}
08 组队(不重复的暴力)
#include<iostream>
using namespace std;
int one[20] = {97, 92, 0, 0, 89, 82, 0, 0, 0, 95, 0, 0, 94, 0, 0, 0, 98, 93, 0, 0};
int two[20] = {90, 85, 0, 0, 83, 86, 0, 97, 0, 99, 0, 0, 91, 83, 0, 0, 83, 87, 0, 99};
int three[20] = {0, 96, 0, 0, 97, 0, 0, 96, 89, 0, 96, 0, 0, 87, 98, 0, 99, 92, 0, 96};
int four[20] = {0, 0, 0, 80, 0, 0, 87, 0, 0, 0, 97, 93, 0, 0, 97, 93, 98, 96, 89, 95};
int five[20] = {0, 0, 93, 86, 0, 0, 90, 0, 0, 0, 0, 98, 0, 0, 98, 86, 81, 98, 92, 81};
int main()
{
int maxsum=0;
for(int i=0;i<20;i++){
for(int j=0;j<20;j++){
if(j==i) continue;
for(int k=0;k<20;k++){
if(k==i||k==j) continue;
for(int m=0;m<20;m++){
if(m==i||m==j||m==k) continue;
for(int n=0;n<20;n++){
if(n==i||n==j||n==k||n==m) continue;
if((one[i]+two[j]+three[k]+four[m]+five[n])>maxsum)
maxsum=one[i]+two[j]+three[k]+four[m]+five[n];
}
}
}
}
}
cout<<maxsum<<endl;
return 0;
}