程序设计思维与实践 CSP-M3 补题 (3/4/数据班)
A - csp-m3-t1
问题分析
根据题目对“段”的定义,建立一个栈,对于每个输入的元素,栈空则入栈,段数加一,不空则与栈顶元素比较,相同则continue
,不同弹出栈顶元素,段数加一。
#include<bits/stdc++.h>
using namespace std;
int main()
{
stack<int> s;
int n,t;
int ans=0;
cin>>n;
while(n--){
cin>>t;
if(s.empty()){
s.push(t);
ans++;
}
else{
if(t==s.top()){
continue;
}
else{
s.push(t);
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
B - csp-m3-t2
问题分析
额外建立一个矩阵。储存消除后的棋盘。
初始状态两个矩阵一样,遍历前矩阵a,如果存在可消除的,在矩阵b中,把有对应位置标记未0.最后扫描矩阵b,进行输出。
#include<bits/stdc++.h>
using namespace std;
int a[105][105];
int b[105][105];
int main()
{
int n,m;
int i,j;
scanf("%d %d",&n,&m);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
b[i][j]=a[i][j];
}
}
for(i=0;i<n;i++)
{
for(j=0;j<m-2;j++)
{
if(a[i][j]==a[i][j+1] && a[i][j+1]==a[i][j+2])
{
b[i][j]=0;
b[i][j+1]=0;
b[i][j+2]=0;
}
}
}
for(i=0;i<m;i++)
{
for(j=0;j<n-2;j++)
{
if(a[j][i]==a[j+1][i] && a[j+1][i]==a[j+2][i])
{
b[j][i]=0;
b[j+1][i]=0;
b[j+2][i]=0;
}
}
}
for(i=0;i<n;i++) //输出
{
printf("%d",b[i][0]);
for(j=1;j<m;j++)
{
printf(" %d",b[i][j]);
}
printf("
");
}
return 0;
}
C - csp-m3-t4
问题分析
水平所限,这个题没有做出来。