趣味算法------音乐会座位

题目描述


创建一个函数来确定每个座位是否可以“看到”前台。如果一个数字严格大于它之前的数字,它就可以“看到”前台。
大家可以在下面的例子中看到前台:

# FRONT STAGE
[[1, 2, 3, 2, 1, 1],
[2, 4, 4, 3, 2, 2],
[5, 5, 5, 5, 4, 4],
[6, 6, 7, 6, 5, 5]]
# 从左边开始,6 > 5 > 2 > 1,所以所有的数字都可以看到。
# 6 > 5 > 4 > 2 - 所以所有数字都可以看到,等等。
不是每个人都能在下面的示例中看到前台:

# FRONT STAGE
[[1, 2, 3, 2, 1, 1], 
[2, 4, 4, 3, 2, 2], 
[5, 5, 5, 10, 4, 4], 
[6, 6, 7, 6, 5, 5]]
# 10 就在 6 的正前方,挡住了它的视线。
输入输出格式
输入格式
第一行 N 表示循环次数。
第二行则是矩阵中的行,每个元素用一个空格隔开。
输出格式
字符串格式即可。

输入输出样例1
输入
3
1 2 3
4 5 6
7 8 9
输出
True
解释
True 表示每个数字都可以看到前台,则该函数应该返回,False 即使单个数字也不能。

输入输出样例2
输入
3
2 0 0
1 1 1
2 2 2
输出
False

输入输出样例3
输入
3
1 0 0
1 1 1
2 2 2
输出
False

说明提示
数字必须严格大于它前面的数字。
矩阵中的所有数字都是大于或等于零的整数。

思路解析:

        看到这道题大部分人的思路应该是先创建好矩阵来存储n*n个元素的信息,然后定义一个函数来确定是否每个元素比在本列之前行的数值要大,具体做法到了现在估计大家也都很熟悉了,接下来我带来一个不同的做法,如果仅仅是为了解决这道题而不是开发什么项目的话,我们完全没必要中规中矩的执行每一个步骤,我们可以在输入数据的同时进行判断,每输入一个元素都要去和同一列先前行的元素逐一比较。

具体代码:

        

#include<stdio.h>

int main(void)

{

    int n;

    int arr[100][100] = { 0 };

    scanf("%d", &n);

    int flag = 1;//如果发现某一个元素先前行同一列的元素等于或者比自己大就为0,否则为1。

    for(int i = 0;i<n&&flag;i++)//注意flag也是判断条件

        for (int j = 0; j < n&&flag; j++)

        {

            scanf("%d", &arr[i][j]);

            if(i)//如果行数不为0,执行下面循环。(因为第0行没有先前行)

                for(int k = i-1;k>=0;k--)

                    if (arr[k][j] >= arr[i][j])//如果发现比自己大的元素

                    {

                        flag = 0;

                        break;

                    }

        }

   

    if(flag)

        printf("True");

    else

        printf("False");

}

注意:

        实际上在开发过程中我是完全不建议大家来做的,接触过缓存区的同学应该明白为什么,以这题为例,由于自己可能输入很多的数据,但是并不是每一个数据都会使用,没有使用的数据可能会造成安全隐患,假如你要在代码最后给一个变量赋值为88,如果你使用的是“输入输出样例3”的话,因为第二行没有完全使用,该变量会赋值为1。

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值