您的位置:首页 > 房产 > 家装 > 163企业邮箱客服_天元建设集团有限公司枣庄_公众号seo排名_如何建立网上销售平台

163企业邮箱客服_天元建设集团有限公司枣庄_公众号seo排名_如何建立网上销售平台

2025/5/9 16:14:51 来源:https://blog.csdn.net/2402_88307286/article/details/146382085  浏览:    关键词:163企业邮箱客服_天元建设集团有限公司枣庄_公众号seo排名_如何建立网上销售平台
163企业邮箱客服_天元建设集团有限公司枣庄_公众号seo排名_如何建立网上销售平台

第十三次CCF-CSP认证

  • 跳一跳
    • 满分题解
  • 碰撞的小球
    • 满分题解
      • 遇到的问题
  • 棋局评估
    • 满分题解

跳一跳

在这里插入图片描述
题目链接

满分题解

没什么好说的 基本思路就是如何用代码翻译题目所给的一些限制,以及变量应该如何更新,没像往常一样给一个n,怎么读入数据,但是总之
这题对于我就俩字 :《凌 驾》

#include <bits/stdc++.h>
using namespace std;
const int N =40;
int s[N];
int main()
{int i=0;s[0]=-1;//我的小细节while(s[i]!=0){cin>>s[i+1];i++;}//读入跳跃数组//如果是第一次跳跃或者上一次跳跃不是中心计2分int grade=0;int sum=2;for(int j=1;j<i+1;j++){while(s[j]==2){if(j==1 || s[j-1]==1 && j>1){grade+=2;sum=2;j++;}else if(s[j-1]==2 && j>1){sum+=2;grade+=sum;j++;}}if(s[j]!=0)grade++;}cout<<grade;
}

碰撞的小球

在这里插入图片描述

样例:

在这里插入图片描述

满分题解

遇到的问题

一开始感觉自己无敌了呀 一看这题目这么长 感觉这题 换做一个星期之前直接copy评论区了,后来通过慢慢分析基本上思路就清晰了,写完感觉这代码非常完美啊,还宏定义了一把,可读性很高啊,调试的时候样例也过了,一交发现就过了两个样例 我cnm,服了
在这里插入图片描述

后来发现:
是我的碰撞判断不完整:当前代码只检查了相邻小球的碰撞情况,实际上任意两个小球都可能发生碰撞,如果只检查初始相邻的两个小球是否碰撞,就会遗漏很多可能的碰撞情况。因此,需要使用两层循环遍历所有的小球对,以确保检查到任意两个小球之间是否发生了碰撞。

#include <iostream>
#include <vector>
using namespace std;#define RIGHT 1
#define LEFT -1struct ball {int div;int pos;
};int main() {int n, L, t;cin >> n >> L >> t;  // 读入 n 个小球,距离长度和时刻vector<ball> balls(n);  // 存储每一个小球的信息for (int i = 0; i < n; i++) {int index;cin >> index;balls[i].pos = index;balls[i].div = RIGHT;  // 一开始统一向右边走}  // 初始化完成while (t--) {// 小球移动for (int i = 0; i < n; i++) {if (balls[i].div == RIGHT) {balls[i].pos++;} else {balls[i].pos--;}}// 检查边界情况for (int j = 0; j < n; j++) {if (balls[j].pos == L) {  // 右端点的情况balls[j].div = LEFT;} else if (balls[j].pos == 0) {  // 左端点的情况balls[j].div = RIGHT;}}// 检查小球之间的碰撞情况for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {if (balls[i].pos == balls[j].pos) {balls[i].div = -balls[i].div;balls[j].div = -balls[j].div;}}}}for (int i = 0; i < n; i++) {cout << balls[i].pos << " ";}cout << endl;return 0;
}    

棋局评估

在这里插入图片描述
样例:
在这里插入图片描述

满分题解

题目非常好理解就是大家都玩过的井字棋,这题感觉更重思维,dfs很少,以我现在的水平是可以独立写一下的,明天再学一学
作者:cyzh
代码链接

#include<bits/stdc++.h>
using namespace std;int g[4][4];
int tt, oo;//数据组数,空格个数//判断是否有人获胜,如果Alice获胜返回1,如果Bob获胜返回2,否则返回0
int check(){for(int i = 0; i < 3; i++){if(g[i][0] == g[i][1] && g[i][1] == g[i][2] && g[i][2]) return g[i][2];if(g[0][i] == g[1][i] && g[1][i] == g[2][i] && g[2][i]) return g[2][i];}if(g[0][0] == g[1][1] && g[1][1] == g[2][2] && g[2][2]) return g[2][2];if(g[0][2] == g[1][1] && g[1][1] == g[2][0] && g[1][1]) return g[1][1];return 0;
}//返回值为题目要求的答案,u 表示剩下0的个数
int dfs(int u){if(check()){if(check() == 1) return u + 1;//Alice已经赢了else return - u - 1;//Bob已经赢了}if(u == 0) return 0;//没有格子可以下了//f11表示Alice赢的最优决策,f22表示Bob赢的最优决策//f12表示Alice赢的次优决策,f21表示Bob赢的次优决策/*为什么要分4个呢,因为如果这一步是Bob下的话如果他能赢 返回f22Bob如果自己赢不了 他会先想到是否能平局 返回0Bob如果不能平局 他会想到怎么多拖一点时间, 返回 f12同理如果这一步是Alice下的话    如果他能赢 返回f11Alice如果自己赢不了 他会先想到是否能平局 返回0Alice如果不能平局 他会想到怎么多拖一点时间, 返回 f21*/int f12 = 20, f21 = -20, f0 = 0, f11 = 0, f22 = 0, tmp;for(int i = 0; i < 3; i++)for(int j = 0; j < 3; j++){if(!g[i][j]){g[i][j] = !(u%2) + 1, tmp = dfs(u - 1), g[i][j] = 0;//dfsif(tmp == 0) f0 = 1;//如果可以平局, f0 = tureelse if(tmp < 0) f22 = min(f22, tmp), f21 = max(f21, tmp);//维护f22, f21else if(tmp > 0) f11 = max(f11, tmp), f12 = min(f12, tmp);//同理}}if(u % 2 && f11) return f11;//这一步是Alice来下 && Alice可以赢else if(!(u % 2) && f22 < 0) return f22;//这一步是Bob来下 && Bob可以赢if(f0) return 0;//可以平局if(u % 2) return f21;//这一步是Alice来下 && Alice 只能让Bob赢return f12;
}int main(){cin >> tt;while(tt--){oo = 0;for(int i = 0; i < 9; i++) cin >> g[i/3][i%3], oo += !g[i/3][i%3];//输入cout << dfs(oo) << endl;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com