2012 小米春季招聘的两个编程题

来源:互联网 发布:caffe 重定向 编辑:程序博客网 时间:2024/03/28 17:05

一、设计一个类MList,它维护一个整数列表(初始为空),并提供了三个方法:

1、把一个整数添加到列表末尾

2、把当前列表翻转

3、顺序输出当前列表中的所有元素

 

请完善该类定义中的...部分(算法效率越高越好)

 

class MList

{

...

void add(int value){...}

void reverse(){...}

void print(){...}

};

 

#include<iostream>using std::cout;using std::endl;void swap(int &a,int &b){a=a^b;b=a^b;a=a^b;}class MList{private :int listsize;int capacity;int *arr;public:MList(){listsize=0;capacity=1000;arr=new int[capacity];}~MList(){delete [] arr;}void add(int value);void reverse();void print();};void MList::add(int value){if(listsize>=capacity){capacity*=2;int *newarr=new int[capacity];if(!newarr){cout<<"allocate failed"<<endl;return ;}for(int i=0;i<listsize;i++)newarr[i]=arr[i];delete []arr;arr=newarr;}arr[listsize++]=value;return ;}void MList::reverse(){int i,j;for(i=0,j=listsize-1;i<j;i++,j--){swap(arr[i],arr[j]);}}void MList::print(){for(int i=0;i<listsize;i++)cout<<arr[i]<<" ";cout<<endl;}int main(){MList list;list.add(1);list.add(2);list.reverse();list.add(3);list.reverse();list.add(4);list.add(5);list.reverse();list.print();return 0;}


二、K皇后问题:

请实现函数count,计算在m*n的矩形棋盘上,摆放k个棋子的可行方案数目。

一个可行方案中,任意两个棋子不在同一行或者同一列或者同一斜线上。(效率越高越好)。

int count(int n,int m,int k);

#include<iostream>using namespace std;int count(int n,int m,int k){int *a=new int [m+1];int backtrack(int *a,int i,int n,int m,int k);int sum=backtrack(a,1,n,m,k);delete []a;return sum;}int backtrack(int *a,int i,int n,int m,int k){static int sum=0;if(i>m){int c=0;for(int j=1;j<=m;++j)if(a[j]!=0)c++;if(c==k)sum ++;}else{bool constraint(int *a,int i);for(int j=0;j<=n;j++){a[i]=j;if(constraint(a,i))backtrack(a,i+1,n,m,k);}}return sum;}bool constraint(int *a,int i){if(a[i]==0)return true;for(int j=1;j<i;j++){if(a[j]==0)continue;if(abs(a[i]-a[j])==abs(i-j)||a[i]==a[j])return false;}return true;}int main(){cout<<count(8,8,8)<<endl;return 0;}