画廊
int d[6][3]=; //方向数组
int x[max+1][max+1],y[max+1][max+1],best[max+1][max+1];
int n,m,best,more;
//回溯法主体
void search (int i,int j)
{
do {
j++;
if(j>m){i++;j=1;}
} while(!y[i][j]==0||(i<n));
if(i>n) {
if(k<best){best=k;copy(bestx,x);}
return;
}
if (k+(t1-t)/5>=best) return;
if ((i<n-1)&&(k+(t2-t)/5>=best)) return;
if ((i<n)) {
change(i+1,j);
search(i,j);
restore(i+1,j);
}
if ((j<m)&&(y[i][j+1]==0)||(y[i][j+2]==0)) {
change(i,j);
search(i,j);
restore(i,j);
}
if ((y[i+1][j]==0)&&(y[i][j+1]==0)) {
change(i.j);
search(i,j);
restore(i,j);
}
}
//调用的函数
void change(int i,int j) //在i,j增加警卫
{
x[i][j]=1;
k++;
for(int s=1;s<=5;s++){
int p=i+d[s][1];
int q=j+d[s][2];
y[p][q]++;
if(y[p][q]==1) t++;
}
}
void restore(int i,int j) //在i,j处去掉警卫
{
//……与上相反即可
}
void main()
{
more=m/4+1;
if(m%4==3) more++;
else if(m%4==2) more+=2;
t2=m*n+more+4;
t1=m*n+4;
best=9999;
if((n==1)&&(m==1)){……}
for(int i=0;i<m+1;i++) {y[0][i]=1;y[n+1][i]=1;}
for(i=0;i<=n+1;i++) {y[i][0]=1;y[i][m+1]=1;}
search(1,0);
//输出结果;

浙公网安备 33010602011771号