33,028
社区成员
发帖
与我相关
我的任务
分享#include <iostream>
#include <fstream>
using namespace std;
template <class T> //我定义了一个模板函数,用于交换
void Swap(T &x,T &y)
{
T temp;
temp = x;
x = y;
y = temp;
}
template <typename T>
void Make2DArray(T** &x, int rows, int cols)
{
x = new T*[rows];
for (int i = 0; i < rows; i++)
{
x[i] = new T[cols];
}
}
class Board
{
friend int ArrangeBoards(int **,int,int,int[]);
private:
void Backtrack(int i);
int len(int w);
int *x, *bestx, *low,*high,bestd,n,m,**B;
};
int Board::len(int w)
{
int i;
for(i=1;i<=m;i++)
{high[i]=0;low[i]=n+1;}
for(i=1;i<=w;i++)
for(int k=1;k<=m;k++)
if(B[x[i]][k])
{if(i<low[k]) low[k]=i;
if(i>high[k]) high[k]=i;
}
int tmp=0;
for(int k=1;k<=m;k++)
if(low[k]<=n && high[k]>0 && tmp<high[k]-low[k])
tmp=high[k]-low[k];
return tmp;
}
void Board::Backtrack(int i)
{
if(i==n)
{
int tmp=len(i);
if(tmp<bestd)
{
bestd=tmp;
for(int j=1;j<=n;j++)
bestx[j]=x[j];
}
}
else
for(int j=i;j<=n;j++)
{
Swap(x[i],x[j]);
int ld=len(i);
if(ld<bestd)
Backtrack(i+1);
Swap(x[i],x[j]);
}
}
int ArrangeBoards(int **B,int n,int m,int bestx[])
{
Board X;
X.x=new int[n+1];
X.low=new int[m+1];
X.high=new int [m+1];
X.B=B;
X.n=n;
X.m=m;
X.bestx=bestx;
X.bestd=n+1;
for(int i=1;i<=n;i++)
X.x[i]=i;
X.Backtrack(1);
delete[] X.x;
delete[] X.low;
delete[] X.high;
return X.bestd;
}
int main()
{
int n,m,*p, i;
//cin>>n>>m;
std::fstream fin("data.txt", std::ios_base::in, std::ios_base::_Openprot);
fin >> n >> m;
p=new int[n+1];
int **B;
Make2DArray<int>(B,n+1,m+1);
for(i=1;i<=n;i++)
for(int j=1;j<=m;j++)
//cin>>B[i][j];
fin >> B[i][j];
cout<<ArrangeBoards(B,n,m,p)<<endl;
for(i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
return 0;
}#include <iostream>
#include <fstream>
using namespace std;
template <class T> //我定义了一个模板函数,用于交换
void Swap(T &x,T &y)
{
T temp;
temp = x;
x = y;
y = temp;
}
template <typename T>
void Make2DArray(T** &x, int rows, int cols)
{
x = new T*[rows];
for (int i = 0; i < rows; i++)
{
x[i] = new T[cols];
}
}
class Board
{
friend int ArrangeBoards(int **,int,int,int[]);
private:
void Backtrack(int i);
int len(int w);
int *x, *bestx, *low,*high,bestd,n,m,**B;
};
int Board::len(int w)
{
int i;
for(i=1;i<=m;i++)
{high[i]=0;low[i]=n+1;}
for(i=1;i<=w;i++)
for(int k=1;k<=m;k++)
if(B[x[i]][k])
{if(i<low[k]) low[k]=i;
if(i>high[k]) high[k]=i;
}
int tmp=0;
for(int k=1;k<=m;k++)
if(low[k]<=n && high[k]>0 && tmp<high[k]-low[k])
tmp=high[k]-low[k];
return tmp;
}
void Board::Backtrack(int i)
{
if(i==n)
{
int tmp=len(i);
if(tmp<bestd)
{
bestd=tmp;
for(int j=1;j<=n;j++)
bestx[j]=x[j];
}
}
else
for(int j=i;j<=n;j++)
{
Swap(x[i],x[j]);
int ld=len(i);
if(ld<bestd)
Backtrack(i+1);
Swap(x[i],x[j]);
}
}
int ArrangeBoards(int **B,int n,int m,int bestx[])
{
Board X;
X.x=new int[n+1];
X.low=new int[m+1];
X.high=new int [m+1];
X.B=B;
X.n=n;
X.m=m;
X.bestx=bestx;
X.bestd=n+1;
for(int i=1;i<=n;i++)
X.x[i]=i;
X.Backtrack(1);
delete[] X.x;
delete[] X.low;
delete[] X.high;
return X.bestd;
}
int main()
{
int n,m,*p, i;
//cin>>n>>m;
std::fstream fin("data.txt", std::ios_base::in, std::ios_base::_Openprot);
fin >> n >> m;
p=new int[n+1];
int **B;
Make2DArray<int>(B,n+1,m+1);
for(i=1;i<=n;i++)
for(int j=1;j<=m;j++)
//cin>>B[i][j];
fin >> B[i][j];
cout<<ArrangeBoards(B,n,m,p)<<endl;
for(i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
return 0;
}