遊戲任務標記-------------->_
阿新 • • 發佈:2019-01-24
[程式設計題] 遊戲任務標記
時間限制:1秒
空間限制:32768K
遊戲裡面有很多各式各樣的任務,其中有一種任務玩家只能做一次,這類任務一共有1024個,任務ID範圍[1,1024]。請用32個unsigned int型別來記錄著1024個任務是否已經完成。初始狀態都是未完成。 輸入兩個引數,都是任務ID,需要設定第一個ID的任務為已經完成;並檢查第二個ID的任務是否已經完成。 輸出一個引數,如果第二個ID的任務已經完成輸出1,如果未完成輸出0。如果第一或第二個ID不在[1,1024]範圍,則輸出-1。
輸入描述:
輸入包括一行,兩個整數表示人物ID.
輸出描述:
輸出是否完成
輸入例子1:
1024 1024
輸出例子1:
1
分析
題目要求用32個 unsigned int 型別來記錄1024個數,每個數有兩種狀態,0或者1,0代表這個任務沒完成,1 代表這個任務未完成。這裡1024個數,用32個unsigned int 表示,那麼如果 1024/32 = 32,每一個unsigned int 要表示32個數(相當於32種狀態位),unsigned int 佔4個位元組,那麼這4個位元組用位來表示32中狀態(4個位元組等於32bit),所以我們可以將1024 分成 32 組,每一個組代表一個unsigned int, 每一個unsigned int 表示32中狀態位,這樣就可以來標識1024中狀態。
Java程式碼實現如下
package com.gcp.test;
import java.util.Scanner;
public class Main5 {
public static void main(String[] args){
int[] a = new int[32];
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
//
int id1 = sc.nextInt();
int id2 = sc.nextInt();
int result = signAndRet(id1,id2,a);
System.out.println(result);
}
}
public static int signAndRet(int id1,int id2,int[] a){
if(id1 < 1 || id1 > 1024 || id2 < 1 || id2 > 1024){
return -1;
}
//開始標記
int groupId = id1/32; //組號碼
int index = id1%32; //第幾位
int value = 1 << index;
if((value & a[index]) == 0){
a[index] += value;
}
groupId = id2/32;
index = id2%32;
value = 1 << index;
if((value & a[index]) == 0){
return 0;
}
return 1;
}
}