⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dlbpl.h

📁 回溯算法中的电路板问题
💻 H
字号:
#include "iostream.h"

class Board
{
public:
	Board(int nn,int mm,int **bb,int *xx);
	~Board();
	void swap(int &a,int &b);
	void backtrack(int i,int dd);
	void print();
private:
	int n,m,bestd;
	int *x,*bestx,*total,*now;
	int **b;
};

Board::Board(int nn,int mm,int **bb,int *xx)
{
	n=nn;
	m=mm;
	x=new int[n+1];
	bestx=xx;
	total=new int[m+1];
	now=new int[m+1];
	bestd=m+1;
	b=bb;
	for(int h=1;h<=m;h++)
	{
		total[h]=0;
		now[h]=0;
	}
	for(int i=1;i<=n;i++)
	{
		x[i]=i;
		for(int j=1;j<=m;j++)
			total[j]+=b[i][j];
	}
}

Board::~Board()
{
	delete []x;
	delete []total;
	delete []now;
}

void Board::swap(int &a,int &b)
{
	int temp=a;
	a=b;
	b=temp;
}

void Board::backtrack(int i,int dd)
{
	if(i==n)
	{
		for(int j=1;j<=n;j++)
			bestx[j]=x[j];
		bestd=dd;
	}
	else
		for(int j=i;j<=n;j++)
		{
			int d=0;
			for(int k=1;k<=m;k++)
			{
				now[k]+=b[x[j]][k];
				if(now[k]>0 && total[k]!=now[k])
					d++;
			}
			if(dd>d)
				d=dd;
			if(d<bestd)
			{
				swap(x[i],x[j]);
				backtrack(i+1,d);
				swap(x[i],x[j]);
			}
			for(int h=1;h<=m;h++)
				now[h]-=b[x[j]][h];
		}
}

void Board::print()
{
	cout<<"电路板最佳排列的密度:"<<bestd<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -