俄罗斯方块新增行算法:不拘一格编程序之二

简介:
不拘一格编程序之二 
俄罗斯方块插入新增随机行算法
作者:朱云翔
 
【题目】:
一个数组int a[10],要求为每个元素随机赋值0或者1,但是这10个元素不能全0,也不能全1。
【说明】:俄罗斯方块中需要在最下面插入若干具有随机方块的行,以增加游戏的难度。当然不能一行全是方块,这样就不能掉呢。也不能没有方块,那样难度会小一些。

【方法1】逐个随机,统一判断
随机产生10个元素,如果都是0,或者都是1,就重新生成。
 
算法的关键不是逐个产生随机数,而是如何确定产生的随机数是全0?全1?或者0、1都有。
【方法1.1】标志法(部分法)
增加变量n1。如果n1=1表示10个随机数全为0.
在增加变量n2。如果n2=1表示10个随机数全为1.
 
int n1 =1, n2 = 1; 
for ( int i=0; i<10; i++) 

        a[i] = random(2); 
         if (a[i] == 0)    n2 = 0 ; 
         else n1 = 0; 
}
if (n1 == 1 || n2 == 1) 重新来过。
 
 
【方法1.2】整体法
将a[i]的取值全部加起来,结果为0表示全0,结果为10表示全1。
int sum=0; 
for ( int i=0; i<10; i++) 

        a[i] = random(2); 
        sum += a[i]; 
}
if (sum==0 || sum == 10) 重新来过。

重新来过又有多种表示方法:
【方法1.3】:标签法
label1: 
n1 = 1; 
n2 = 1; 
for ( int i=0; i<10; i++) 

        a[i] = random(2); 
         if (a[i] == 0)    n2 = 0 ; 
         else n1 = 0; 

if (n1 == 1|| n2 == 1)  goto lable1;
 
【方法1.4】:循环法法
n1=1;n2=1; 
while (n1==1||n2==1) 

        n1 = 1; 
        n2 = 1; 
         for ( int i=0; i<10; i++) 
        { 
                a[i] = random(2); 
                 if (a[i] == 0)    n2 = 0 ; 
                 else n1 = 0; 
        } 
}
 
【方法1.5】:循环法
int sum=0; 
while(sum=0 || sum==10) 

        sum=0; 
         for ( int i=0; i<10; i++) 
        { 
                 a[i] = random(2); 
                sum += a[i]; 
        } 
}
 
【方法2】:先后随机
重新生成随机数太麻烦了,反正10个随机数字至少有一个0和一个1,不如先随机确定0和1的位置,再随机产生其它8个随机数。
 
定义变量n1是0的位置,变量n2是1的位置。
第一次随机的n1有0~9一共10个位置,第二次的n2则只有9个位置:
int n1,n2; 
n1 = random(10); 
n2=random(9); 
if (n2 >= n1) n2++;     如果n1=3,n2=3,那么n2其实是第4个。同理如果n1=3,n2=4,其实是第5个。 
a[n1]=0; 
a[n2]=1; 
for ( int i=0; i<10; i++) 

         if (i == n1 || i == n2)  continue;                这两个已经有了,不用了。 
        a[i] = random(2); 
}
【方法3】:逐个随机,再来随机
先随机生成10个数。如果全为0的话,再随机选择一个位置生成1;如果全为1的话,则随机选择一个位置生成0。
int n; 
int sum=0; 
for ( int i=0; i<10; i++) 

        a[i]=random(2); 
        sum+=a[i]; 

if (sum==0) 

        n=random(10); 
        a[n]=1; 

if (sum==10) 

        n=random(10); 
        a[n]=0; 
}
当然,上面的程序还可以改为:(把最后的判断合一)。
int n; 
int sum=0; 
for ( int i=0; i<10; i++) 

        a[i]=random(2); 
        sum+=a[i]; 

if (sum==0 || sum == 10) 

        n=random(10); 
        a[n]= sum/10; 
}
【方法4】:整体随机,位运算
利用位运算,随机产生一个1~210-1之间的数,这个数一共10位,而且不会每位皆为0(全为0的数是0),也不会全为1(全为1的数是210-1),那么再将这个数的每一位的取值赋值到数组a[i]中对应的元素去就可以了。
int u; 
u = random(1023) + 1;     如果不加1,是0~1022之间,而我们需要1~1023之间。 
for( int i=0; i<10;i++) 

        a[i] = (u>>i)&1; 
}
或者这样:
int u; 
u = random(1023) + 1;     如果不加1,是0~1022之间,而我们需要1~1023之间。 
for( int i=0; i<10;i++) 

        a[i] = u&1; 
        u=u>>1; 
}

当然,实际上还有更多的方法,而每种方法实现也有更多的表示方法,同学们在编程序的时候不要限制了自己的思维,不同的环境下,需要不同的方法。



 本文转自 zhuyunxiang 51CTO博客,原文链接:http://blog.51cto.com/zhuyunxiang/128492,如需转载请自行联系原作者

相关文章
|
存储 算法 索引
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
123 0
【每日挠头算法题】LeetCode 1337. 矩阵中战斗力最弱的 K 行 —— 二分 + 排序 / 堆
|
机器学习/深度学习 算法 计算机视觉
【图像去噪】基于自组织迁移算法 (SOMA) 实现行图像去噪附matlab代码
【图像去噪】基于自组织迁移算法 (SOMA) 实现行图像去噪附matlab代码
|
算法 Java C#
【算法千题案例】每日LeetCode打卡——79.键盘行
📢前言 🌲原题样例:键盘行 🌻C#方法:排序遍历 🌻Java 方法:计数 💬总结
【算法千题案例】每日LeetCode打卡——79.键盘行
|
算法
文字处理技术:布局的核心是行布局,难点是换行算法
文字处理技术:布局的核心是行布局,难点是换行算法
435 0
|
算法 索引
算法帖——用舞蹈链算法(Dancing Links)求解俄罗斯方块覆盖问题
问题的提出:如下图,用13块俄罗斯方块覆盖8*8的正方形。如何用计算机求解?     解决这类问题的方法不一而足,然而核心思想都是穷举法,不同的方法仅仅是对穷举法进行了优化   用13块不同形状的俄罗斯方块(每个方块只能使用一次)覆盖住棋盘,很容易就想到这是“精确覆盖问题”(13个俄罗斯方块完全覆盖住8*8的正方形)。
2829 0
|
算法 Java
备忘小算法:Java将一维数组数据绘制成N行M列矩阵(如九宫格)
 备忘小算法:Java将一维数组数据绘制成N行N列矩阵(如九宫格) 一个小算法的备忘:用Java将一维数组数据绘制成N行M列的矩阵。
1423 0
|
算法 前端开发 PHP
不足80行,一种清晰而又简单通用的分页算法,你有这么想过吗?C#版
分页,是WEB开发中面对的最常见的编程,实现方法多种多样。我也不来评论这些方法的好坏。 但我总感觉它们太复杂,不够清晰不够简单。我十分欣赏PHP中一个Pager.php分页类的算法。http://www.phpclasses.org/browse/file/288.html,作者不详。
956 0
|
7天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
13天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。