1 条题解

  • 0
    @ 2023-6-11 12:17:59

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    int a[20][8];//存储符合条件的牛
    int r[8];//存储每头牛的编号的二进制
    int k;//符合条件的牛的头数
    int b;//每头牛有几只角
    int d;//需要几只角不同才友好
    
    //将编号为n的牛的编号转换为2进制
    void jinzhi(int n){
    	int i; 
    	//清空r数组
    	for(i = 0;i < b;i++){
    		r[i] = 0;
    	} 
    	
    	i = 0;
    	while(n != 0){
    	   r[i] = n % 2;
    	   n = n / 2;
    	   i++;
    	}
    }
    
    //判断编号为n的牛和前面的牛是否友好
    bool you(){
    	bool f = true;
    	//循环a数组的每头牛,判断r数组的这头牛和a数组的每头牛是否友好
    	int i,j,c; 
    	for(i = 0;i < k;i++){
    		c = 0;//假设r和a[i]有c只不同的角
    		for(j = 0;j < b;j++){
    			if(a[i][j] != r[j]){
    				c++;
    				if(c >= d){
    					break;
    				}
    			}
    		}
    		//如果a[i]和r不友好
    		if(c < d){
    			f = false;
    			break;
    		}
    	}
    	
    	return f;
    }
    
    
    int main(){
    	int i = 0,j;
    	int n;
    	cin>>n>>b>>d;
    	k = 1;
    	bool f;
    	cout<<0<<" ";
    	while(k < n){
    		i++;//判断下一组
    		jinzhi(i); 
    		f = you();//判断r和a数组的牛是否友好
    		if(f == true){
    			//将r数组的牛角存储到a数组
    			for(j = 0;j < b;j++){
    				a[k][j] = r[j];
    			} 
    			cout<<i<<" ";
    			k++;
    		} 
    	}
    }
    
    

    Python :

    def add(a,b):
        k=0
        for i in range(len(a)):
            if(a[i]!=b[i]):
                k=k+1
        return(k)
    sr=input().split()
    N=int(sr[0])
    B=int(sr[1])
    D=int(sr[2])
    k=1
    a=[]
    x=bin(0)[2:]
    x=x.zfill(B)
    a.append(x)
    print(0,end=" ")
    for i in range(1,2**B):
        x=bin(i)[2:]
        x=x.zfill(B)
        f=1
        for j in range(len(a)):
            y=a[j]
            if(add(x,y)<D):
                f=0
                break
        if(f==1):
            a.append(x)
            k=k+1
            if(k<=N):
                print(i,end=" ")
    
    
    • 1

    信息

    ID
    2452
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者