第六届CCF软件能力认证
1.数位之和
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std; int main(){
string n ;
cin>>n ;
int i ;
int sum = ;
for (i = ; i < n.size() ; i++){
sum += (n[i] - '') ;
}
printf("%d\n" , sum) ; return ;
}
2.消除类游戏
现在给你一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子,请给出经过一次消除后的棋盘。
请注意:一个棋子可能在某一行和某一列同时被消除。
接下来n行,每行m个整数,用空格分隔,分别表示每一个方格中的棋子的颜色。颜色使用1至9编号。
2 2 3 1 2
3 4 5 1 4
2 3 2 1 3
2 2 2 4 4
3 4 5 0 4
2 3 2 0 3
0 0 0 4 4
2 2 3 1 2
3 1 1 1 1
2 3 2 1 3
2 2 3 3 3
3 0 0 0 0
2 3 2 0 3
2 2 0 0 0
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std; int main(){
//freopen("in.txt","r",stdin) ;
int a[][] ;
int b[][] ;
int n , m ;
scanf("%d %d" , &n , &m) ;
int i , j ;
for (i = ; i < n ; i++){
for(j = ; j < m ; j++){
scanf("%d" , &a[i][j]) ;
b[i][j] = a[i][j] ;
}
} for (i = ; i < n ; i++){
for(j = ; j < m ; j++){
if(j >= (m-))
continue ;
int t = a[i][j] ;
int k = j ;
if (t == a[i][k+]){
int sum = ;
while(a[i][k+] == t){
sum++ ;
k++ ;
}
if (sum >= ){
for(int l = ; l < sum ; l++){
a[i][j+l] = ;
}
}
} }
} for(j = ; j < m ; j++){
for (i = ; i < n ; i++){
if(i >= (n-))
continue ;
int t = b[i][j] ;
int k = i ;
if (t == b[k+][j]){
int sum = ;
while(b[k+][j] == t){
sum++ ;
k++ ;
}
if (sum >= ){
for(int l = ; l < sum ; l++){
b[i+l][j] = ;
}
}
} }
} for (i = ; i < n ; i++){
for(j = ; j < m ; j++){
if(b[i][j] == )
a[i][j] = ;
printf("%d " , a[i][j]) ;
}
printf("\n") ;
} return ;
}
3.画图
..____.____..____..____...___..
./.___/.___||.._.\|.._.\./._.\.
|.|...\___.\|.|_).|.|_).|.|.|.|
|.|___.___).|..__/|.._.<|.|_|.|
.\____|____/|_|...|_|.\_\\___/.
本题要求编程实现一个用 ASCII 字符来画图的程序,支持以下两种操作:
画线:给出两个端点的坐标,画一条连接这两个端点的线段。简便起见题目保证要画的每条线段都是水平或者竖直的。水平线段用字符 - 来画,竖直线段用字符 | 来画。如果一条水平线段和一条竖直线段在某个位置相交,则相交位置用字符 + 代替。
填充:给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。注意这里的相邻位置只需要考虑上下左右 4 个方向,如下图所示,字符 @ 只和 4 个字符 * 相邻。
.*.
*@*
.*.
第2行至第q + 1行,每行是以下两种形式之一:
0 x1 y1 x2 y2:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么x1 = x2 且y1 ≠ y2,要么 y1 = y2 且 x1 ≠ x2。
1 x y c:表示填充操作,(x, y)是起始位置,保证不会落在任何已有的线段上;c 为填充字符,是大小写字母。
画布的左下角是坐标为 (0, 0) 的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。这q个操作按照数据给出的顺序依次执行。画布最初时所有位置都是字符 .(小数点)。
1 0 0 B
0 1 0 2 0
1 0 0 A
A--A
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4 2 C
...+--------+...
...|CCCCCCCC|...
...|CC+-----+...
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC|.........
...|CC+-----+...
...|CCCCCCCC|...
...+--------+...
................
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std; int d[][] = {{,},{,-},{,},{-,} } ;
char a[][] ;
int n , m , q ;
void dfs(int x , int y , char ch)
{
int fx , fy ;
int i , j;
a[x][y] = ch;
for (i = ; i < ; i++)
{
fx = x + d[i][] ;
fy = y + d[i][] ;
if (fx< || fx>=n || fy< || fy>=m || a[fx][fy] == '-' || a[fx][fy] == '|' || a[fx][fy] == '+' || a[fx][fy] == ch)
{
continue;
}
a[fx][fy] = ch ; dfs(fx,fy,ch) ;
}
return ;
} int main(){
// freopen("in.txt","r",stdin) ; scanf("%d %d %d" , &m , &n , &q) ;
int i , j ;
for (i = ; i < n ; i++){
for(j = ; j < m ; j++){
a[i][j] = '.' ;
}
} while(q--){
int op ;
scanf("%d" , &op) ;
if (op == ){
int x1 , y1 , x2 , y2 ;
scanf("%d%d%d%d" , &y1 , &x1 , &y2 , &x2) ;
//printf("%d %d %d %d\n" , y1 , x1 , y2 , x2) ;
if(x1 == x2){
if (y1 > y2)
swap(y1 , y2) ;
for(int k = y1 ; k <= y2 ; k++){
if (a[x1][k] == '|' || a[x1][k] == '+')
a[x1][k] = '+' ;
else
a[x1][k] = '-' ;
}
}
else if(y1 == y2){
if (x1 > x2)
swap(x1 , x2) ;
for(int k = x1 ; k <= x2 ; k++){
if (a[k][y1] == '-' || a[x1][k] == '+')
a[k][y1] = '+' ;
else
a[k][y1] = '|' ;
}
}
}
else{
int x ,y ;
char ch ;
scanf("%d%d" ,&y , &x ) ;
cin>>ch ;
dfs(x,y,ch) ; }
}
for (i = n- ; i >= ; i--){
for(j = ; j < m ; j++){
printf("%c" , a[i][j]);
}
printf("\n") ;
} return ;
}
4.送货
任务虽然繁重,但是小明有足够的信心,他拿到了城市的地图,准备研究最好的方案。城市中有n个交叉路口,m条街道连接在这些交叉路口之间,每条街道的首尾都正好连接着一个交叉路口。除开街道的首尾端点,街道不会在其他位置与其他街道相交。每个交叉路口都至少连接着一条街道,有的交叉路口可能只连接着一条或两条街道。
小明希望设计一个方案,从编号为1的交叉路口出发,每次必须沿街道去往街道另一端的路口,再从新的路口出发去往下一个路口,直到所有的街道都经过了正好一次。
接下来m行,每行两个整数a, b,表示和标号为a的交叉路口和标号为b的交叉路口之间有一条街道,街道是双向的,小明可以从任意一端走向另一端。两个路口之间最多有一条街道。
如果不存在方案使得小明经过每条街道正好一次,则输出一个整数-1。
1 2
1 3
1 4
2 4
3 4
1 2
1 3
1 4
2 4
3 4
2 3
前50%的评测用例满足:1 ≤ n ≤ 100, n-1 ≤ m ≤ 10000。
所有评测用例满足:1 ≤ n ≤ 10000,n-1 ≤ m ≤ 100000。
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std; stack<int>S;
const int MAXN=;
int edge[MAXN][MAXN];
int result[MAXN] ;
int n,m;
int l = ; void dfs(int x){
S.push(x);
for(int i=;i<=n;i++){
if(edge[x][i]>){
edge[i][x]=edge[x][i]=;//删除此边
dfs(i);
break;
}
}
} //Fleury算法的实现
void Fleury(int x){
S.push(x);
while(!S.empty()){
int b=;
for(int i=;i<=n;i++){
if(edge[S.top()][i]>){
b=;
break;
}
}
if(b==){
//printf("%d",S.top());
result[l] = S.top() ;
l++ ;
S.pop();
}else {
int y=S.top();
S.pop();
dfs(y);//如果有,就dfs
}
}
// printf("\n");
} int main(){
//freopen("in.txt","r",stdin) ;
scanf("%d%d",&n,&m); //读入顶点数以及边数
memset(edge,,sizeof(edge));
int x,y;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
edge[x][y]=edge[y][x]=;
}
//如果存在奇数顶点,则从奇数顶点出发,否则从顶点0出发
int num=,start=;
for(int i=n;i>=;i--){ //判断是否存在欧拉回路
int degree=;
for(int j=n;j>=;j--){
degree+=edge[i][j];
}
if(degree&){
start=i,num++;
}
}
if(num==||num==){
Fleury(start);
for(int i=l-;i>=;i--)
printf("%d " , result[i]) ;
printf("\n") ;
}else
printf("-1\n");
return ;
}
5.矩阵
宏观世界的物体运动规律始终跟物体当前的状态有关,也就是说只要知道物体足够多的状态信息,例如位置、速度等,我们就能知道物体之后任意时刻的状态。
现在小M创造了一个简化的世界。
这个世界中,时间是离散的,物理规律是线性的:世界的初始状态可以用一个m维向量b(0)表示,状态的转移方式用m×m的矩阵A表示。
若已知这个世界当前的状态是b,那么下一时刻就等于b左乘状态转移矩阵A,即Ab。
这个世界中,物体的状态也是离散的,也就是说可以用整数表示。再进一步,整数都可以用二进制编码拆分为有限位0和1。因此,这里的矩阵A和向量b的每个元素都是0或1,矩阵乘法中的加法运算视为异或运算(xor),乘法运算视为与运算(and)。
具体地,设矩阵A第i行第j列的元素为ai, j,向量b的第i个元素为bi。那么乘法Ab所得的第k个元素为
(ak,1 and b1) xor (ak,2 and b2) xor ⋯ xor (ak,m and bm)
矩阵和矩阵的乘法也有类似的表达。
小M发现,这样的矩阵运算也有乘法结合律,例如有A(Ab)=(AA)b=A2b。
为了保证自己创造的世界维度不轻易下降,小M保证了矩阵A可逆,也就是说存在一个矩阵A-1,使得对任意向量d,都有A-1Ad=d。
小M想了解自己创造的世界是否合理,他希望知道这个世界在不同时刻的状态。
具体地,小M有n组询问,每组询问会给出一个非负整数k,小M希望你帮他求出Akb。
接下来m行,每行包含一个长度为m的01串,表示矩阵A。
接下来一行,包含一个长度为m的01串,表示初始向量b(0)。(b(0)是列向量,这里表示它的转置)
注意:01串两个相邻的数字之间均没有空格。
接下来一行,包含一个正整数n,表示询问的个数。
最后n行,每行包含一个非负整数k,表示询问Akb(0)。
注意:k可能为0,此时是求A0b(0) =b(0)。
注意:01串两个相邻的数字之间不要输出空格。
110
011
111
101
10
0
2
3
14
1
1325
6
124124
151
12312
010
111
101
110
010
100
101
001
100
对于评测用例1,m = 10,n = 100,k ≤ 103。
对于评测用例2,m = 10,n = 100,k ≤ 104。
对于评测用例3,m = 30,n = 100,k ≤ 105。
对于评测用例4,m = 180,n = 100,k ≤ 105。
对于评测用例5,m = 10,n = 100,k ≤ 109。
对于评测用例6,m = 30,n = 100,k ≤ 109。
对于评测用例7,m = 180,n = 100,k ≤ 109。
对于评测用例8,m = 600,n = 100,k ≤ 109。
对于评测用例9,m = 800,n = 100,k ≤ 109。
对于评测用例10,m = 1000,n = 100,k ≤ 109。
第六届CCF软件能力认证的更多相关文章
- 【实(dou)力(bi)首(mai)发(meng)】第四次CCF软件能力认证题解
这次的题总体上相对前三次偏简单.由于实力有限,就分析前四题. 试题编号: 201503-1 试题名称: 图像旋转 时间限制: 5.0s 内存限制: 256.0MB 问题 ...
- 第四届CCF软件能力认证
1.图像旋转 问题描述 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度. 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可. 输入格式 输 ...
- 第四届CCF软件能力认证(CSP2015) 第五题(最小花费)题解
[问题描述] C国共有$n$个城市.有$n-1$条双向道路,每条道路连接两个城市,任意两个城市之间能互相到达.小R来到C国旅行,他共规划了$m$条旅行的路线, 第$i$条旅行路线的起点是$s_i$,终 ...
- 第三届CCF软件能力认证
1.门禁系统 问题描述 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况.每位读者有一个编号,每条记录用读者的编号来表示.给出读者的来访记录,请问每一条记录中的读者是第几次出现. 输入格式 ...
- 第二届CCF软件能力认证
1. 相邻数对 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 输出一个 ...
- 第一届CCF软件能力认证
1.相反数 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数). 输入格式 第一行包含一个正整数 N.(1 ≤ N ≤ 500). 第二行为 ...
- 第五届CCF软件能力认证
1.数列分段 问题描述 给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段? 输入格式 输入的第一行包含一个整数n,表示数列中整数的个数. 第二行包含n个整数a1, a2, … ...
- CCF计算机软件能力认证试题练习:201912-5 魔数
CCF计算机软件能力认证试题练习:201912-5 魔数 前置知识:BFS,线段树等 \(f(x) = (x\%A)\%B\) 这个函数值的和直接用线段树维护是不太行的(也可能是我不知道),后来想了很 ...
- 第六届蓝桥杯软件类省赛题解C++/Java
第六届蓝桥杯软件类省赛题解C++/Java 1[C++].统计不含4的数字统计10000至99999中,不包含4的数值个数.答:暴力循环范围内所有数字判断一下就是了,答案是52488 1[Java]. ...
随机推荐
- 第一天:简单工厂模式与UML类图
何为简单工厂模式: 通过专门定义一个类,来负责创建其他类的实例,这些其它类通常具有共同的父类. 简单工厂模式的UML类图: 简单工厂模式中包含的角色和相应的职责如下: ...
- ROI align解释
转自:blog.leanote.com/post/afanti.deng@gmail.com/b5f4f526490b ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, ...
- Java并发编程原理与实战四十一:重排序 和 happens-before
一.概念理解 首先我们先来了解一下什么是重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段. 从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如下图 ...
- Dialog插件artDialog
经本人测试,发现没有layer好用,因为artDialog不能拖拽.不过除了拖拽,其他还蛮简洁的,在自定义上的灵活性也还可以.下面是我自己写的测试demo. <!DOCTYPE html> ...
- 基于受限玻尔兹曼机(RBM)的协同过滤
受限玻尔兹曼机是一种生成式随机神经网络(generative stochastic neural network), 详细介绍可见我的博文<受限玻尔兹曼机(RBM)简介>, 本文主要介绍R ...
- POJ 3783 Balls --扔鸡蛋问题 经典DP
题目链接 这个问题是谷歌面试题的加强版,面试题问的是100层楼2个鸡蛋最坏扔多少次:传送门. 下面我们来研究下这个题,B个鸡蛋M层楼扔多少次. 题意:给定B (B <= 50) 个一样的球,从 ...
- c++刷题(15/100)矩阵转置,最深子树
题目一:矩阵转置 给定一个矩阵 A, 返回 A 的转置矩阵. 矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引. 示例 1: 输入:[[1,2,3],[4,5,6],[7,8,9]] 输出 ...
- JS设计模式——11.适配器模式
适配器模式概述 适配器模式可用来在现有接口和不兼容的类之间进行适配.使用这种模式的对象又叫包装器(wrapper). 适配器特点 从表面看,适配器模式很像门面模式.她们都要对别的对象进行包装并改变其呈 ...
- Unix/Linux系统时间函数API
首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...
- XSS姿势——文件上传XSS
XSS姿势--文件上传XSS 原文链接:http://brutelogic.com.br/blog/ 0x01 简单介绍 一个文件上传点是执行XSS应用程序的绝佳机会.很多网站都有用户权限上传个人资料 ...