2019年第十届蓝桥杯c++A组java/c++组题解

时间:2023-12-19 20:05:50

2019年第十届蓝桥杯c++A组java/c++组题解2019年第十届蓝桥杯c++A组java/c++组题解

 #include<iostream>
#include<vector>
using namespace std;
vector <int > vec;
long long sum;
int main(){
for(int i=;i<=;i++){
int cnt=;
int a[]={,,,};
int t=i;
while(t){
a[cnt]=t%;
t/=;
cnt++;
}
for(int j=;j<cnt;j++){
if(a[j]==||a[j]==||a[j]==||a[j]==){
vec.push_back(i);
break;
}
}
}
for(vector<int>::iterator it = vec.begin(); it != vec.end(); it++){
sum+=(*it)*(*it);
}
cout<<sum;
return ;
}

思路是将1到2019的所有数字的每一位存到a数组里,然后比较它的每一位看有没有2,0,1,9;如果有就插入到队列里面。

然后将队列中每个元素的平方存到sum里再输出。

第二题

2019年第十届蓝桥杯c++A组java/c++组题解

 #include<iostream>
using namespace std;
int main(){
int d;
int a=,b=,c=;
for(int i=;i<=;i++){
d=(a+b+c)%;
a=b%;
b=c%;
c=d%;
}
cout<<d;
}

这个就是要注意模10000来避免超范围。

第3题

2019年第十届蓝桥杯c++A组java/c++组题解


2019年第十届蓝桥杯c++A组java/c++组题解

解法1

 #include <iostream>
#include <string>
#include <queue> using namespace std; string ss[];
int maze[][];
int dir[][] = { { , }, { , - }, { , }, { -, } };
char letter[] = { 'D', 'L', 'R', 'U' };
int cnt = ;
bool vis[][]; struct node
{
int x;
int y;
string s;
int step;
node(int xx, int yy, string ss, int st)
{
x = xx;
y = yy;
s = ss;
step = st;
}
}; bool in(int x, int y)
{
if (x < && x >= && y < && y >= )
{
return true;
}
return false;
} void bfs(int x, int y, string s, int step)
{
queue<node> q;
q.push(node(x, y, s, step));
while (!q.empty())
{
node now = q.front();
q.pop(); vis[now.x][now.y] = true; if (now.x == && now.y == )
{
if (now.step < cnt)
{
cnt = now.step;
cout << now.step << " : " << now.s << endl; }
continue;
} for (int i = ; i < ; i++)
{
int tx = now.x + dir[i][];
int ty = now.y + dir[i][]; if (maze[tx][ty] != && !vis[tx][ty] && in(tx, ty))
{
q.push(node(tx, ty, now.s + letter[i], now.step + ));
}
}
}
} int main()
{
for (int i = ; i < ; i++)
{
cin >> ss[i];
} for (int i = ; i < ; i++)
{
for (int j = ; j < ; j++)
{
maze[i][j] = (ss[i][j] - '');
}
} int step = ;
string s = "";
bfs(, , s, step); system("pause");
return ;
}

解法2:yxc做的

 #include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <queue> using namespace std;
const int N = ;
int n, m;
string g[N];
int dist[N][N];
int dx[] = {, , , -}, dy[] = {, -, , };
char dir[] = {'D', 'L', 'R', 'U'}; void bfs()
{
queue<pair<int,int>> q;
memset(dist, -, sizeof dist);
dist[n - ][m - ] = ;
q.push({n - , m - });
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = ; i < ; i ++ )
{
int x = t.first + dx[i], y = t.second + dy[i];
if (x >= && x < n && y >= && y < m && dist[x][y] == - && g[x][y] == '')
{
dist[x][y] = dist[t.first][t.second] + ;
q.push({x, y});
}
}
}
}
int main()
{
cin >> n >> m;
for (int i = ; i < n; i ++ ) cin >> g[i];
bfs();
cout << dist[][] << endl;
int x = , y = ;
string res;
while (x != n - || y != m - )
{
for (int i = ; i < ; i ++ )
{
int nx = x + dx[i], ny = y + dy[i];
if (nx >= && nx < n && ny >= && ny < m && g[nx][ny] == '')
{
if (dist[x][y] == + dist[nx][ny])
{
x = nx, y = ny;
res += dir[i];
break;
}
}
}
}
cout << res << endl;
return ;
}
解法3,先输入30,50,行号列号
 #include<iostream>
#include<queue>
using namespace std;
char ma[][];
bool visit[][];
int dx[] = {, , , -};
int dy[] = {, -, , };
char d[] = {'D', 'L', 'R', 'U'};
int main() {
int n, m;
cin >> n >> m;
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
cin >> ma[i][j];
}
}
queue<pair<int,int> > que;
queue<string> step; //记录路径
visit[][] = true;
que.push(make_pair(, ));
step.push("");
while(!que.empty()) {
pair<int, int> top = que.front();
int x = top.first;
int y = top.second;
string s = step.front();
que.pop();
step.pop();
if (x == n && y == m) {
cout << s.length() << endl;
cout << s;
break;
}
for (int i = ; i < ; i++) {
int tx = x + dx[i];
int ty = y + dy[i];
string tem = s;
if (visit[tx][ty] == true || ma[tx][ty] == '' || tx < || tx > n || ty < || ty > m) {
continue;
}
tem = tem + d[i];
visit[tx][ty] = true;
step.push(tem);
que.push(make_pair(tx,ty));
}
}
return ;
}
第四题
2019年第十届蓝桥杯c++A组java/c++组题解

这题就是每周都找最大的。

第一周49 48 47 46 3个数   就是46

第二周45 44 43 42 3个数   就是42

第三周41 40 39 38 3个数   就是38

所以每周最大的都是-4;4,5,6,7周最大的中位数分别为34,30,26,22;

然后7周的就是22,26,30,34,38,42,46;

所以答案就是34