问题描述:某部门要安装电子锁,要求在M个工作人员中每人发一张磁卡,卡上有解锁的磁条,为了确保安全,必须要N个人在一起才能将锁打开,输入M,N 求磁条最小方案。如:
样例输入:
5 3
样例输出:
0111000111
0011111010
1001011101
1100101011
1110110100
1代表能解开该处的磁条,0代表不能解开
今天晚上写的太累了,就不解释了,下次加上注释说明。直接上代码:
#include "iostream" #include "string" using namespace std; bool fun(int num,int col){ int a = 0; while(num>0){ if(num%2==1) a++; num /= 2; } if(a==col) return true; return false; } string change(int num,int length){ string result; while(num>0){ int a = num%2 + '0'; result.insert(0,1,(char)a); num/=2; } int t = length - result.size(); result.insert(0,t,'0'); return result; } int main(){ int m,n; cin>>m>>n; int lock,openLock,closeLock; int t1 = 1,t2 = 1; for(int i=0;i<n-1;i++){ t1 *= (m-i); t2 *= (i+1); } lock = t1/t2; int *p = new int[lock]; int col = m-n+1; int temp = 0; for(int i=0;i<lock;i++){ temp++; while(!fun(temp,col)){ temp++; } p[i] = temp; } string *ps = new string[lock]; for(int i=0;i<lock;i++){ ps[i] = change(p[i],m); } for(int i=0;i<m;i++){ for(int j=0;j<lock;j++){ cout<<ps[j][i]; } cout<<endl; } }
作者:lcl15572830433 发表于2013-12-17 0:50:48 原文链接
阅读:87 评论:0 查看评论