java初學 多公尺諾光控燈(位運算)

2021-08-08 20:14:52 字數 2886 閱讀 3453

多公尺諾光控燈是乙個燈的陣列,每行燈不超過60盞,共有不超過1000萬行。

圖1 多公尺諾光控燈示意圖

(1)對每一盞燈的操作都是使其狀態反轉;

(3)施加乙個反轉序列的操作會影響所有的行,每行只反轉一盞燈;

(4)多公尺諾光控燈陣列可以生成一行摘要資訊,這行摘要資訊也是一行燈,燈的滅與亮是由這列上所有燈的狀態決定的。如果相應列上的亮燈總數是奇數,則指示燈是亮的;如果相應列上亮燈總數是偶數,則指示燈滅的。

(5)最後要輸出指示燈亮的總數量。

執行說明:第2次執行是乙個4行5列的燈陣,後面的兩個引數是變換的規則;第1次執行的資料量比較大,要注意「-xmx200m」表示使用的最大記憶體為200m,你的程式要控制好記憶體,不要超記憶體。

輸出效果:

實驗環境:記事本; 公共類:exp1;

private int rown;    //每行容量,即列數

private int coln;    //每列容量,即行數

private int array;    //用來儲存燈的陣列,每一位(bit)即一盞燈

private int unit = integer.size;    //整型位數,固定為32

public exp1( int rown, int coln )        //建構函式

public void set( int rown, int coln )    //設定引數

public int getrown()        //得到列數

public int getcoln()        //得到行數

public boolean getstatus( int x, int y )    //得到第x行第y列燈盞的亮滅狀態,返回true為亮

public void reverse( int x, int y )         //反轉燈的狀態

private static void setfun(  exp1 exp, string str )    //分析命令,從中解析引數,並進行相應操作

public static void main( string args )    //主函式

首先利用 integer.parseint() 函式對輸入的列數、行數 以及命令進行解析。f=0時先反轉第一行燈i,然後逐行操作至最後一行。當f=1則從最後一行逐行向上。

對所有命令操作完畢後按列對各盞燈的狀態進行查詢。每列亮燈數為偶,則該列燈滅;為奇,則該列燈亮 。

對燈陣列的儲存:用整型陣列array[ ],陣列每個元素即乙個int型,為32位(unit),將燈按行儲存入每個元素的每一位,要得到某盞燈的位置,xy分別為行列座標,array[(rown*x+y) / unit]即該燈所處的陣列中的元素,(rown*x+y) % unit即該燈在此元素中的位編號(均從0起)。

判斷某盞燈的狀態:找到該燈位置,將其所處元素邏輯右移 i (即(rown*x+y) % unit)位,也就是將該燈移到最低一位,與0x01按位與,若燈亮結果仍為0x01,否則燈滅。

反轉燈的狀態:先進行狀態判斷,若原本燈亮,即變1為0,將0x01左移到該燈所處位,取反(從000···1···000變為111···0···111形式),和該燈所在元素按位與;若原本燈滅,即變0為1,直接將0x01左移到該燈所處位,和該燈所在元素按位或。

1、integer.parseint():以第二個引數所指定基數將字串引數分析為乙個帶符號的整數。

2、傳入主方法的args[ ]自動按空格分割。

3、str.tochararray():將字串轉化為字元陣列character.isdigit():判斷該字元是否乙個數字

4、<

public class exp1

public exp1()

public void set( int rown, int coln)

public int getrown()

public int getcoln()

public boolean getstatus(int x, int y)

public void reverse(int x, int y)

private static void setfun( exp1 exp, string str )

f = integer.parseint(ss);

}else if(strtochar[i] == 'i')

i = integer.parseint(ss);

}else if(strtochar[i] == 'c')

c = integer.parseint(ss);

}else if(strtochar[i] == 'p')

p = integer.parseint(ss);

}else if(strtochar[i] == 's')

s = integer.parseint(ss);}}

if(f == 0)

}else}}

public static void main( string args )

int count = new int[rown];

for(int i = 0; i < rown; i++)

if(flag % 2 == 0)

count[i] = 0;

else

count[i] = 1;

}int light = 0;

for(int i : count)

system.out.println("指示燈亮的數量是:" + light);}}

多公尺諾骨牌

100張多公尺諾骨牌整齊地排成一列,按順序編號為1 2 3 4 99 100。第一次拿走所有的奇數字置上的骨牌,第二次再從剩餘的骨牌中拿走所有奇數字置上的骨牌,依次類推,請問最後剩下的一張骨牌的編號是多少 a.48 b.50 c.52 d.64 正確答案 d.答對了嗎?答對了嗎?答對了嗎?第一次拿走...

838 推多公尺諾

一行中有n張多公尺諾骨牌,我們將每張多公尺諾骨牌垂直豎立。在開始時,我們同時把一些多公尺諾骨牌向左或向右推。每過一秒,倒向左邊的多公尺諾骨牌會推動其左側相鄰的多公尺諾骨牌。同樣地,倒向右邊的多公尺諾骨牌也會推動豎立在其右側的相鄰多公尺諾骨牌。如果同時有多公尺諾骨牌落在一張垂直豎立的多公尺諾骨牌的兩邊...

多公尺諾骨牌

現有n塊 多公尺諾骨牌 s1,s2,s3,sn水平放成一排,每次骨牌si包含左右兩個部分,每個部分賦予乙個非負整數值,如下圖所示為包含6塊骨牌的序列.骨牌可做180度旋轉,使得原來在左邊的值變到右邊,而原來右邊的值移到左邊,假設不論si如何旋轉,l i 總是儲存si左邊的值,r i 總是儲存si右邊...