程式設計題—遊戲任務標記
阿新 • • 發佈:2019-02-02
內容會持續更新,有錯誤的地方歡迎指正,謝謝!
問題
遊戲裡面有很多各式各樣的任務,其中有一種任務玩家只能做一次,這類任務一共有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;
}