1. 程式人生 > >程式設計題—遊戲任務標記

程式設計題—遊戲任務標記

內容會持續更新,有錯誤的地方歡迎指正,謝謝!

問題

遊戲裡面有很多各式各樣的任務,其中有一種任務玩家只能做一次,這類任務一共有1024個,任務ID範圍[1,1024]。請用32個unsigned int型別來記錄著1024個任務是否已經完成。初始狀態都是未完成。 輸入兩個引數,都是任務ID,需要設定第一個ID的任務為已經完成;並檢查第二個ID的任務是否已經完成。 輸出一個引數,如果第二個ID的任務已經完成輸出1,如果未完成輸出0。如果第一或第二個ID不在[1,1024]範圍,則輸出-1。

輸入描述:
輸入包括一行,兩個整數表示人物ID.

輸出描述:
輸出是否完成

輸入例子1:
1024 1024

輸出例子1:
1

輸入例子2:
1021 1024

輸出例子2:
0

分析

unsigned int為32位,32個unsigned int為32*32=1024位,剛好可以存1024個1/0資料。所以,用點陣圖(BitMap)來做。

正常思路的程式碼

#include <iostream>
#include <algorithm>
#define N 1024
using namespace std;

int main()
{
    int ID1,ID2;
    while(cin>>ID1&&cin>>ID2)
    {
        if
(ID1<1||ID1>1024||ID2<1||ID2>1024) { cout<<-1<<endl; continue; } //32*32=1024,32個unsigned int剛好可以存放1024個1、0資料 unsigned int arr[32]; /*位運算 arr[(ID1-1)>>5]:先將[1,1024]變成[0,1023],所以ID1-1 再把ID1-1除以32,也就是右移5位,得到ID1-1在arr中的索引號 把ID1-1對32求餘,也就是&31(對於2的冪才能這樣幹),得到其 在該索引中的位號,在將1移動該位號的長度,再把arr[(ID1-1)>>5] 和(1<<(ID1-1)&31)做或運算,最後複製給等式左邊。*/
arr[(ID1-1)>>5]|=(1<<((ID1-1)&31)); //拿ID2來驗證是否已完成該任務 cout<< ((arr[(ID2-1)>>5]&(1<<((ID2-1)&31)))!=0) <<endl; } return 0; }

投機取巧的程式碼

#include <iostream>
#include <algorithm>
int main() 
{
    using namespace std;
    unsigned int n, m;
    while (cin >> n >> m) 
    {
        if (n < 1 || n > 1024 || m < 1 || m > 1024) 
            cout << -1 << endl;
        else 
        {
            if (n == m) 
                cout << 1 << endl;
            else
                cout << 0 << endl;
        }
    }
    return 0;
}