俄罗斯方块新增行算法:不拘一格编程序之二
生活随笔
收集整理的這篇文章主要介紹了
俄罗斯方块新增行算法:不拘一格编程序之二
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
不拘一格編程序之二? 俄羅斯方塊插入新增隨機行算法 作者:朱云翔 ? 【題目】: 一個數組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;
}
當然,實際上還有更多的方法,而每種方法實現也有更多的表示方法,同學們在編程序的時候不要限制了自己的思維,不同的環境下,需要不同的方法。 ? 相關文章:不拘一格編程序之一循環打印算法?? ????????? 不拘一格編程序之二俄羅斯方塊新增行算法 ???????????????? ?不拘一格遍程序之三變量取值交換算法 不拘一格編程序之四循環的各種形式
【方法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;
}
當然,實際上還有更多的方法,而每種方法實現也有更多的表示方法,同學們在編程序的時候不要限制了自己的思維,不同的環境下,需要不同的方法。 ? 相關文章:不拘一格編程序之一循環打印算法?? ????????? 不拘一格編程序之二俄羅斯方塊新增行算法 ???????????????? ?不拘一格遍程序之三變量取值交換算法 不拘一格編程序之四循環的各種形式
總結
以上是生活随笔為你收集整理的俄罗斯方块新增行算法:不拘一格编程序之二的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原来SMPlayer可以直接播放音乐CD
- 下一篇: asp.net mvc 405