蓝桥杯编程训练集锦01

蓝桥杯编程训练01

蛇形矩阵

这道题做了两遍,第一遍有个小地方没注意到,就是在每一行的输出中两个数字必须用一个空格隔开,所以自然的在每个格式%d后加了空格,然而出错了,应该是最后一个数据后不能加空格,应该直接加回车。

#include <stdio.h>
int main(){
     int n,i=0,j=0;   int a[100][100];
     scanf("%d",&n);
     a[0][0]=1;
     for(i=0;i<n;i++)
     {
          for(j=0;j<n-i-1;j++)
          {
               a[i][j+1]=a[i][j]+j+i+2;
          }
          j=0;   a[i+1][0]=a[i][0]+i+j+1;
     }
     for(i=0;i<n;i++)
     {
          for(j=0;j<n-i-1;j++)
          {
               printf("%d ",a[i][j]);
          }
          printf("%d\n",a[i][j]);   j=0;
     }
     return 0;
}
获得输入字符的方法汇总

三种获得字符串的方法的区别:scanf gets getchar

1)使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束
2)gets()函数将接收输入的整个字符串直到遇到换行为止
char src[100];
gets(src);
上述的两者在接受字符串时:
a.不同点: scanf不能接受空格、制表符Tab、回车等; 而gets能够接受空格、制表符Tab和回车等;
b.相同点: 字符串接受结束后自动加’\0’。
3)
getchar()是在输入缓冲区顺序读入一个字符(包括空格、回车和Tab) getchar()使用不方便,解决方法:
使用下面的语句清除回车: while(getchar()!=’\n’);
具体的实例:
gets获取字符串代码

#include<stdio.h> 
int main()
{
    char src[100];
    printf("input a string:");
    gets(src);
    printf("src = %s\n",src); 
    return 0;
}
//使用getchar()获取字符串
#include<stdio.h>
int main()
{
    char ch;
    char src[10];
    int i = 0;
    while((ch = getchar()) != '\n')
    {
        src[i] = ch;
	i++;
	if(i == 9)
	{
	     printf("error!\n");
	     exit(1);
	} 
	src[i] = '\0'; 
    }
    return 0;
}
//scanf的输入数组的方法
1#include<stdio.h>
int main()
{
    int a[3];
    int i;
    int *p = a; 
    for(i = 0; i <= 2; i++)
    {
        scanf("%d",p++);//不可以用a++ 是因为a是常量不可以自加,*p = a 指针可以自加 p++
    }
    p = a;
    for(i = 0;i < 3; i++)
    {
        printf("a[%d] = %d\n",i,*(p + i));
    }     
	return 0;
}
2#include<stdio.h>
int main()
{
    int a[3];
    int i;    
    for(i = 0; i <= 2; i++)
    {
        scanf("%d",&a[i]);
    }
    p = a;
    for(i = 0;i < 3; i++)
    {
        printf("a[%d] = %d\n",i,a[i]);
    }       
	return 0;
}
3#include<stdio.h>
int main()
{
    int a[3];
    int i;  
    for(i = 0; i <= 2; i++)
    {
        scanf("%d",a+i);
    }
    p = a;
    for(i = 0;i < 3; i++)
    {
        printf("a[%d] = %d\n",i,*(a + i));
    }       
	return 0;
}

原文链接:https://blog.csdn.net/u011436427/article/details/82432351.

检验几个数两两不同

运用数据和数组下标的巧妙联系:

int []kk=new int[10];  //用来检验是否9个数有重复
kk[A]++;kk[B]++;kk[C]++;kk[D]++;kk[E]++;
kk[F]++;kk[G]++;kk[H]++;kk[I]++;
int i;
for(i=1;i<=9;i++)
{
if(kk[i]!=1)break;//如果有一个数重复则无效(即等于0或大于1时必然有重复)
}
//凑算式的代码如下:
#include <iostream>
using namespace std;
int a[10]; //用a数组记录ABC所代表的数  a[0]为A,a[1]为B,依此类推
int v[10]; //标记数值i是否已经被使用,未被使用v[i]为0,已经使用v[i]为1
int sum = 0; //记录满足公式的个数
void f(
    int cnt) // cnt表示已经有cnt个字母已经确定好了值,等到9字母都确定,判断是否满足公式
{
    if (cnt == 9) //所有字母都已经确定,进入判别公式
    {
        int A = a[0];
        int C = a[2];
        int GHI = a[6] * 100 + a[7] * 10 + a[8];
        int DEF = a[3] * 100 + a[4] * 10 + a[5];
        int B = a[1];
        if (B * GHI + DEF * C == (10 - A) * C * GHI) {
            sum++;
            return;
        }
    }
    for (int i = 1; i <= 9; i++) {
        if (v[i] == 0) //判段数值i是否出现过
        {
            a[cnt] = i;
            v[i] = 1;   //标记数i已经出现过
            f(cnt + 1); //递归,确定下一个位置的数值
            v[i] = 0;   // 回溯
        }
    }
}

int main() {
    f(0);
    printf("%d", sum);
    return 0;
}
保证数据结果可靠
  1. 被除数乘1.0,转化为浮点型,这样可以消除5/4=1的情况。
  2. 形式变换,除法转换为乘法来验证,5不等于1*4。
  3. 用float、double等浮点型数据。
  4. loading…
全排列问题

参考:https://blog.csdn.net/HowardEmily/article/details/68064377.
全排列就是求一组数据的所有排列,例如 abc 的全排列为 abc、acb、bac、bca、cab、cba。
C++中的 next_permutation() 函数包含在< algorithm>里面
使用的基本格式为:

int a[];
do{  条件和操作; } while(next_permutation(a,a + n));
  1. next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。
  2. 注意顺序,要想求出全排列,必须从字典顺序的第一个开始。
  3. 做题时注意!大范围数据全排列的时间复杂度太大了,很多时候都是用递归程序来代替。
一维数组的利用

一维数组有两个要素:下标、内容值。灵活地运用下标和内容值的对应关系(逻辑关系方面,抽象,一般是在脑子里明确好)来实现各种要求。

1. 描述或记录二维平面:

例如八皇后问题的一个数据结构: queen[第几行] = 第几列。同时这个下标也是一种解决问题的顺序。

2. 用于记录某种状态:

这里是内容值的 0或1 ,对应某下标的两个状态(有或没有)。

八皇后
#include <cmath>
#include <iostream>
using namespace std;
int N,sum = 0;
int queenPos[100];
void Nqueen(int k);

int main()
{
     cin>>N;
     Nqueen(0);
     cout<<sum<<endl;
     return 0;
}
void Nqueen(int k)
{
     int i;
     if(k==N){
          sum++;
          return;
     }
     for(i=0;i<N;i++){
          int j;
          for(j=0;j<k;j++)
          {
               //if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j))
               if(queenPos[j]==i||queenPos[j]+j==i+k||queenPos[j]-j==i-k)
               break;
          }
          if(j==k)
          {
               queenPos[k] = i;
               Nqueen(k+1);
          }
     }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值