一、设计一个类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;
}