微软面试百题006——八皇后变种

来源:互联网 发布:软件导刊是核心吗 编辑:程序博客网 时间:2024/05/16 23:59

1.题目描述:

腾讯面试题:
给你10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0 在下排出现了6 次,1 在下排出现了2 次,
2 在下排出现了1 次,3 在下排出现了0 次....

2.判断公式

1.b1+b2+...+bn=n

2.a1*b1+a2*b2+...+an*bn=n

3.up[i]=num(down[i]==up[i])   i=0...9

3.算法思路:

DFS深度优先搜索是感觉最好写,也是最容易想到的思路思路
我们从1号位开始一直到n号位,虽然有的人人为,这样DFS的话情况不就是10*10*。。。*10,pow(10,10)
那样的话,情况不就太多了,DFS做的话,会不会特别慢,这里面我们要这样考虑,因为我们加入了一个公式(上面公式1),这个公式在后续的递归中会作为一个重要的约束条件,会约束所有的可能情况,不会出现我们预设的pow(10,10)的复杂度,会自动减去不少的枝,这一点我们考虑到就好做了


4.代码实现(C++类封装):

#include"iostream"#include"cstdio"#include"cstdlib"#define N 11using namespace std;class numberquestion{public:numberquestion(){flag=0;memset(up,0,sizeof(up));memset(down,0,sizeof(down));}friend istream& operator>>(istream&,numberquestion&);friend ostream& operator<<(ostream&,numberquestion&);void find(int,int);bool judge();private:int up[N];int down[N];int flag;};istream& operator>>(istream& in,numberquestion& k){for(int i=1;i<=10;i++) cin>>k.up[i];return in;}ostream& operator<<(ostream& out,numberquestion& k){for(int i=1;i<=10;i++) cout<<k.up[i]<<' ';cout<<endl;for(int i=1;i<=10;i++) cout<<k.down[i]<<' ';cout<<endl;return out;}void numberquestion::find(int sumb,int now){if(flag==1) return ;if(now==11&&sumb==10&&judge()){flag=1;cout<<*this<<endl;}else{if(now==11) return ;for(int i=0;i<=10-sumb;i++){down[now]=i;find(sumb+i,now+1);down[now]=0;}}}bool numberquestion::judge(){int sum1=0,sum2=0;for(int i=1;i<=10;i++){int t=0;for(int j=1;j<=10;j++){if(down[j]==up[i]) t++;}if(t!=down[i]) return 0;}for(int i=1;i<=10;i++) sum1+=down[i];for(int i=1;i<=10;i++) sum2+=up[i]*down[i];if(sum1==10&&sum2==10) return 1;else return 0;}int main(){numberquestion my;cin>>my;my.find(0,1);return 0;}


0 0
原创粉丝点击