首页 > 试题广场 >

游戏里面有很多各种各样的任务,其中有一种任务玩家只能做一次,

[问答题]
游戏里面有很多各种各样的任务,其中有一种任务玩家只能做一次,这类任务一共有1024个,任务ID范围[1,1024].请用32个unsigned int类型来记录着1024个任务是否已经完成。初始状态为未完成。
输入两个参数,都是任务ID,需要设置第一个ID的任务为已经完成;并检查第二个ID的任务是否已经完成。
输出一个参数,如果第二个ID的任务已经完成输出1,如果未完成输出0,。如果第一或第二个ID不在[1,1024]范围,则输出1.
如:
输入:1024 1024
输出:1
//每个unsigned int 有32位,unsigned int target[32]就可表示 32*32个任务ID的状态。
#include<iostream>
using namespace std;

int main()
{
	unsigned int target[32] = {0};
	int ID1, ID2;
	cin>>ID1>>ID2;
	if(ID1<1||ID1>1024||ID2<1||ID2>1024)
	{
		cout<<-1<<endl;
		return 0;
	}
	int groupID = ID1/32;
	int indexID = ID1%32;
	int marktmp = 1<<indexID;
	target[groupID] = target[groupID]|marktmp;

	groupID = ID2/32;
	indexID = ID2%32;
	marktmp = 1<<indexID;

	if(marktmp & target[groupID]) cout<<1<<endl;
	else cout<<0<<endl;

	return 0;
}

发表于 2017-08-28 01:36:42 回复(9)
32个unsigned int就是32*32=1024位,每个位存储一个任务是否完成。按一定的顺序规则存储即可,其他就是写代码实现了。
发表于 2017-11-19 20:31:02 回复(0)
#include <iostream>
using namespace std;
unsigned int buff[32] = {0};

int main(){
    int n1, n2;
    cin >>n1>>n2;

    unsigned int set = 0x1;
    set = set << n1%32;
    buff[n1/32] =  buff[n1/32] | set;

    unsigned int get = 0x1;
    get = get << n2%32;
    unsigned int ans = buff[n2/32] & get;
    
    cout<<(ans>>n2%32)<<endl;
    return 0;
}

编辑于 2020-04-25 18:20:16 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String id1 = scanner.next();
        String id2 = scanner.next();
        getAnswer(id1, id2);
    }
    public static void getAnswer(String s1, String s2){
        HashMap<String, String> index = new HashMap<>();
        int id = 1;
        for(int i=1; i<33; i++){
            for(int j=1; j<33; j++){
                index.put(String.valueOf(id),String.valueOf(i)+String.valueOf(j));
                id++;
            }
        }
        if(!index.containsKey(s1)||!index.containsKey(s2)){
            System.out.println(-1);
        } else if(index.get(s1).equals(index.get(s2))){
            System.out.println(1);
        } else {
            System.out.println(0);
        }
        
    }
}

其实输入的一样不就可以了么。。。
发表于 2019-08-15 09:28:53 回复(0)
//使用bitset类
#include<bitset>
#include<iostream>
bool conditionTest(int num)
{
    if(num>1024 || num<1)return false;
    else return true;
}
int main(int argc,char* argv[])
{
    int first=0,second=0;
    int ret=0;
    while(std::cin>>first && std::cin>>second)
    {
        std::bitset<1024> task;
        if(conditionTest(first)&& conditionTest(second))
        {
            task[first-1]=1;
            if(task.test(second-1)) ret=1;
            else ret=0;
        }
        else ret=1;
        std::cout<<ret<<std::endl;
    }
}

编辑于 2019-06-13 09:03:19 回复(0)

#include<iostream>
using namespace std;
//设置num的第x位为1,高位在左低位在右,第1位在最低位 void SetBit(unsigned int & num, int x) {  unsigned int n = 1;  n = n << (x-1);  num = num | n; }
//获取num的第x位的值,高位在左低位在右,第1位在最低位 int GetBit(unsigned int  num, int x) {  unsigned int n = 1;  n = n << (x - 1);  num = num & n;  if (0 != num)  {   return 1;  }  return 0; } int main() {  unsigned int arr[32] = { 0 };//arr[0],arr[1]...arr[31]
 unsigned int p, q;  cin >> p >> q;  if( (p<1)||(p>2014)|| (q < 1) || (q > 2014))  {   cout << 1;   return 0;  }  int i = (p - 1) / 32 + 1;//矩阵的第i个元素,对应arr[i-1]  int x = p % 32;//unsigned int型,最低位第1位,最高位第32位,现在第x位  if (0 == x)  {   x = 32;  }  int j= (q - 1) / 32 + 1;  int y = q % 32;  if (0 == y)  {   y = 32;  }  SetBit(arr[i-1], x);//设置arr[i-1]元素的第x位为1,则表示p个任务已做完  if (1 == GetBit(arr[j-1],y))  {   cout << 1;  }  else  {   cout << 0;  }  //cout << arr[0] << endl;  return 0; }

发表于 2019-03-23 17:23:34 回复(0)
发现用Java的人好少啊

import java.util.Scanner;

public class Main {

    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;

    }

}

发表于 2019-03-09 16:08:42 回复(0)

#include<iostream>

using namespace std;

unsigned int fin[32];

int main() {
    unsigned int res, a, b;
    cin >> a >> b;
    if (a < 1 || a > 1024 || b < 1 || b > 1024)res = 1;
    else {
        a--, b--;
        fin[a / 32] |= 1 << (a % 32);
        res = (fin[b / 32] & (1 << (b % 32)));
    }
    cout << (res > 0 ? 1 : 0) << endl;
    return 0;
}
发表于 2019-03-08 22:30:48 回复(0)
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;

int task(int id1, int id2)
{
    if (id1 < 1 || id1 > 1024 || id2 < 1 || id2 > 1024)
        return 1;
    else
    {
        unsigned int buff[32];
        memset(buff, 0, sizeof(buff));
        int i = (id1-1) / 32;
        int j = (id1-1) % 32;
        buff[i] |= 1<<j;
        i = (id2-1) / 32;
        j = (id2-1) % 32;
        if ((buff[i] & (1<<j)) == 0)
            return 0;
        else
            return 1;
    }
}

int main()
{
    cout<<task(1024,1024)<<endl;
    return 0;
}
发表于 2018-08-05 17:02:26 回复(0)
#include <iostream>

using namespace std;

int main()
{     unsigned int *mission_list=new unsigned int[32];     for(int i=0;i<32;i++)     {         mission_list[i]=0;     }     int id1,id2;
    cin>>id1>>id2;
    if(id1<1||id1>1024||id2<1||id2>124)     {         cout<<1<<endl;     }     else     {         int list1_index=id1/32;         int list1_index_two=id1%32;         int list2_index=id2/32;         int list2_index_two=id2%32;         unsigned int change=1;         change=change<<list1_index_two;         mission_list[list1_index]+=change;         unsigned int test=1;         test=test<<list2_index_two;         cout<<mission_list[list2_index]<<endl;         cout<<test<<endl;         if(mission_list[list2_index]&test==1)         {             cout<<1<<endl;         }         else         {             cout<<0<<endl;         }     }
    return 0;
}

发表于 2018-04-03 21:04:58 回复(0)
#include <bits/stdc++.h>
using namespace std;

void Set(uint32_t ntb[], uint32_t setN)
{
    uint32_t row = (setN - 1) / 32;
    uint32_t column = (setN - 1) % 32;
    uint32_t setbit = 1 << (column);
    ntb[row] |= setbit;
}

void Get(uint32_t ntb[], uint32_t getN)
{
    uint32_t row = (getN - 1) / 32;
    uint32_t column = (getN - 1) % 32;
    uint32_t getbit = 1 << column;
    cout << (getbit & ntb[row] ? 1 : 0) << endl;
}

int main()
{
    uint32_t ntb[32];
    memset(ntb, 0, sizeof(ntb));
    uint32_t setN, getN;
    while(cin >> setN >> getN)
    {
        Set(ntb, setN);
        Get(ntb, getN);
    }
}

发表于 2017-09-12 16:38:43 回复(0)
题目要求用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中状态。
发表于 2017-09-10 01:12:32 回复(1)
#include <iostream>
using namespace std;

const int NUM = 32;
unsigned int flags[NUM] = {0};

bool bitCheck(int pos);//检查pos上的bit位是否为1,为1返回true
void bitSet(int pos);//设置对应的bit位

int task(int task2set,int task2check);

int main(void){
    cout<<task(1024,1024)<<endl;
    return 0;
}

int task(int task2set,int task2check){
    if(task2set<1 || task2set > 1024 || task2check<1 || task2check >1024){
        return 1;
    }
    bitSet(task2set-1);
    return bitCheck(task2check-1);
}

bool bitCheck(int pos){//检查pos上的bit位是否为1,为1返回true
    int byteIndex = pos / 8;
    int bitIndex = pos % 8;

    unsigned char byte = flags[byteIndex];

    return ( byte & (1<<(7-bitIndex)) );
}

void bitSet(int pos){//设置对应的bit位
    int byteIndex = pos / 8;
    int bitIndex = pos % 8;

    unsigned char byte = flags[byteIndex];
    byte = (byte | (1<<(7-bitIndex)) );
    flags[byteIndex] = byte;
}

发表于 2017-09-05 13:29:11 回复(0)
#include<iostream>

using namespace std;

int main()
{
  int id1,id2;
 cin>>id1>>id2;
 unsigned int bitmap[32]  = {0};
 int res = 0;
bool f1 = id1 >=1 && id1 <=1024;
bool f2 = id2 >= 1 && id2 <= 1024;
if(f1 &&f2)
{
   int index = id1 /sizeof(unsigned int);
   int index2 = id1 % 32;
  bitmap[index] | = 1<<index2;
  int idx = id2 /sizeof(unsigend int);
  int idx2 =  id2 % 32;
if(bitmap[idx] >> idx2) {
res = 1;
else 
res = 0;
}
else{
res = 1;
}
cout<<res<<endl;
}
发表于 2017-09-04 10:15:02 回复(0)
#include<iostream>

using namespace std;


int main()
{
    unsigned int fir,sec;
    cin>>fir>>sec;

    unsigned int task[1025];

    if(fir<1||fir>1024||sec<1||sec>1024)
    	cout<<"1."
    else
    {
    	task[fir]=1;
    	if(1!=task[sec])
    		cout<<"0"<<endl;
    	else
    		cout<<"1"<<endl;
    }
    
    return 0;
}

发表于 2017-08-31 20:56:16 回复(0)
//感觉题目的意思是利用unsigned int类型是32位所以用32个32位的unsigned int类型来表示1024个任务
//所以我就设了一个32大小的数组,每个元素都有32位,每一位代表一个任务,通过位操作来完成。

#include<iostream>
using namespace std;
 
int main(){
    int a,b,c,d;
    cin>>a>>b;
    unsigned int m[32];
    for(int i=0;i<32;i++)
        m[i]=0x0000;
    if(a<1||a>1024||b<1||b>1024){
         cout<<1;
         return 0;
    }
    c=a/32;
    d=a%32;
    m[c]=m[c]|(1<<(d-1));
    
      c=b/32;
    d=b%32;
    if(m[c]>>(d-1)&1){   cout<<1;
   }
   else  cout<<0;
     system("pause");  return 0;
}


编辑于 2017-08-27 17:27:19 回复(0)
#include<stdio.h>
#include<iostream.h>
 int main() {
 	unsigned int taskDone[1024];
 	memset(taskDone, sizeof(unsigned int), 1024);
 	unsigned int taskID1, taskID2;
 	cin >> taskID1 >> taskID2;
 	unsigned int ret;
 	if(taskID1>1024) {
	 	ret = 1;	cout << ret << endl;	return 0;
	 }
 	else {
	 	taskDone[taskID1 - 1] = 1;
	 	if(taskID2 > 1024) {
	 		ret = 1;	cout << ret << endl; return 0;
	 	}
	 	else{	
		 	if(taskDone[taskID2-1] == 0){	
			 	ret = 0;	cout << ret << endl;	return 0;
		 	}
		 	else{
		 		ret = 1;	cout << ret << endl; 	return 0;
		 	}
	 	}	 	
	 }
 }
发表于 2017-08-25 14:54:36 回复(0)
//不知道对不对
#include <iostream>
using namespace std;

unsigned int state[32];
int IDstate(int id1,int id2)
{
    if (id1 > 1024 || id1 < 1 || id2>102 || id2 < 1)
        return 1;
    unsigned int s = 0;
    int index1 = id1 / 32;
    int remainder1 = id1 % 32;
    s += 1;
    state[index1] = state[index1] | s << remainder1;

    int index2 = id2 / 32;
    int remainder2 = id2 % 32;
    if (state[index2] & s << remainder2)
        return 1;
    else
        return 0;
}

int main()
{
    int  s1,s2;
    while (cin >> s1)
    {    
        cin >> s2;
    cout << IDstate(s1, s2);
    system("pause");

    }

    return 0;
}
发表于 2017-08-25 11:42:33 回复(0)