深度遍历 或者 优先级排序
#include<iostream>
#include<vector>
using namespace std;
struct MatrixElem
{
unsigned int n;
unsigned int x_ordinate;//将用于保存二维MatrixElem数组中本元素自身的下标
unsigned int y_ordinate;//将用于保存二维MatrixElem数组中本元素自身的下标
bool operator==(const MatrixElem& righthand)
//定义等号,新元素进入向量时用find函数检查是否已有横或纵坐标一样的元素
{
return x_ordinate==righthand.x_ordinate||y_ordinate==righthand.y_ordinate;
}
MatrixElem operator+(const MatrixElem& righthand)//定义加号,好算元素之和
{
MatrixElem result={n+righthand.n,0,0};//坐标不用管,用不着的
return result;
}
};
template<typename T>
class MyVector:public vector<T>
{
public:
bool find(T d)//定义一个在向量中查找指定元素的函数
{
iterator itr;
for(itr=begin();itr!=end();itr++)
if(*itr==d)return true;
return false;
};
T sum()
{
iterator itr;T t={0,0,0};
for(itr=begin();itr!=end();itr++)
t=t+*itr;
return t;
};
};
MatrixElem**me;
void Initialize(unsigned int n)
{
me=new MatrixElem*[n];
for(int i=0;i<n;i++)
me[i]=new MatrixElem[n];
}
void FreeElem(unsigned int n)
{
for(int i=0;i<n;i++)
delete []me[i];
delete me;me=0;
}
MyVector<MatrixElem> mv;
/*将用到的一些全局变量*/
int total=99999;
int result;
unsigned int N;//矩阵边长
void Scan(int y)
{
int i;MatrixElem tmp;
if(mv.size()!=N)
{
for(i=0;i<N;i++)
{
tmp=me[i][y];
if(!mv.find(tmp))
{
mv.push_back(tmp);
Scan(y+1);//扫下一行
mv.pop_back();
}
}
}
else
{
result=mv.sum().n;/*result, 全局变量, 保存相加结果*/
if(result<total) total=result;
return;
}
}
int main()
{
cout<<"请输入矩阵边长:";cin>>N;
Initialize(N);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
me[i][j].n=(unsigned int)rand()%20;
me[i][j].x_ordinate=j; //把二维数组下标变成类的成员变量
me[i][j].y_ordinate=i; //把二维数组下标变成类的成员变量
}
for(i=0;i<N;i++)
{
for(int j=0;j<N;j++)
cout<<me[i][j].n<<'\t';
cout<<endl;
}
Scan(0);
cout<<"最小和:"<<total<<endl;
return 0;
}
算到10花近半分钟