算法入门实例(一)

一:贪吃蛇填数

在n*n的矩阵中,填入矩阵维度,然后形成一个蛇形矩阵,例如,当填入维度为4时,形成的蛇形矩阵:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4

思路分析

可以想象对这个蛇形矩阵的绘制时,是在绘制一条路。笔的起点是在第一行的最后一列。笔的轨迹是下,下,下,左,左,左,上,上,上,右,右,下,下,左,上。那么关键点就在于,何时转弯,转弯的时候涉及到了矩阵的边界,那么我们就可以通过矩阵的边界来判断是否转弯。

例如:假如我们使用a[x][y]来表示这个矩阵
1,2,3,4由于此时笔是从上到下的,到达4时,此时笔的位置是a[3][3],此时笔再往下(即++x),那么矩阵将会越界,所以此时我们让笔的方向改变为从右到左 。
5 , 6 , 7,此时笔的方向是从右到左(即–y),到达7时,此时笔再往左,那么矩阵将会越界,因此我们改变方向为从下到上。
以此类推

代码实现

#include <stdio.h>

#define maxn 20
int a[maxn][maxn];

int main(){

    int x, y, n, tmp;
    printf("请输入矩阵的维度:\n");
    scanf("%d", &n);
    memset(a,0,sizeof(a));
    tmp = a[x=0][y=n-1] = 1;

    while(tmp < n*n){
        while(x+1<n && !a[x+1][y]) a[++x][y] = ++tmp;
        while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tmp;
        while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tmp;
        while(y+1<n && !a[x][y+1]) a[x][++y] = ++tmp;
    }

    for(x = 0; x < n; x++){
        for(y = 0; y < n; y++){
            printf("%3d", a[x][y]);
        }
        printf("\n");
    }
}

结果:

这里写图片描述

二:猜数字游戏

一个经典的猜数字游戏,给定答案序列,每一个用户输入猜的序列,统计有多少个数字猜中(A),有多少个数字在两个序列都出现过,但是位置不对(B),输入0序列退出。
例如:
给定答案序列:1,2,3,4
用户猜1,3,5,6
那么A和B对应的值为:(1,1)

思路分析

A很容易得到,只需要判断输入的每一个数在答案序列中是否存在,存在便+1。
B则有点麻烦,可以这样来实现:统计1-9每一个数字在答案序列和用户猜的序列的出现次数分别为c1,c2,取最小的为B。1-9遍历的B累加,最后减去A,便是在两个序列都出现过,但是位置不对的数目。

代码实现


#include <stdio.h>
#define maxn 100

int main(){
   int a[maxn], b[maxn], n, i ,j;
   scanf("%d", &n);
   //输入答案序列 
   for(i = 0; i < n; i++){
     scanf("%d", &a[i]);
   }
   //输入猜序列 
   for(;;){
     int A=0, B=0;
     for(i = 0; i < n; i++){
        scanf("%d", &b[i]);
        if(b[i] == a[i]){
            A++;
        }
     }
     if(b[0] == 0) break;
     //计算B
     for(i = 1; i <= 9; i++){
        int c1=0, c2=0;
        for(j = 0; j < n;j++){
            if(i == a[j]) c1++;
            if(i == b[j]) c2++;
        }
        if(c1 < c2){
            B += c1;
        }else{
            B += c2;
        }
     }
     printf("   (%d,%d)", A, B-A);
   }
} 

结果:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值