问题描述:在8*8国际象棋棋盘上,如果放置若干个马后,使得整个棋盘的任意控位置上所放置的棋子都能被马吃掉,就称这组放置为一个满覆盖,若去掉满覆盖的任意一个棋子都会使他不再是满覆盖,就称为一组极小慢覆盖;程序要求如下:
1 、求解一个极小满覆盖。
2、最好能画出棋盘的图形形式,并在其上动态的演视试探过程。
3、程序能方便移植到其他规格棋盘上。
求大神帮忙解答,万分感谢(最好帮忙写出程序,本人编程菜鸟,期末课程设计)!!!!
马的满覆盖问题(期末课程设计),求大神帮忙!!!
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答
- qq_36375691 2016-12-29 07:03关注
#include
#include
/*get_attact( )
void chess::get_attact() //计算每个位置被马吃掉的次数
{ for(int i=0;i { for(int j=0;j { if(i-1>=0&&j-2>=0) {attact[i-1][j-2]++;}
if(i-1>=0&&j+2 if(i-2>=0&&j-1>=0) {attact[i-2][j-1]++;}
if(i-2>=0&&j+1 if(i+1=0) {attact[i+1][j-2]++;}
if(i+1 if(i+2=0) {attact[i+2][j-1]++;}
if(i+2 } } }
get_horse(chess c)
void chess::get_horse(chess c) // 计算极小满覆盖
{ int max=attact[0][0];
int max_i=0,max_j=0;
for(int i=0;i { for (int j=0;j { if(attact[i][j]>max)
{ max=attact[i][j];
max_i=i;
max_j=j;
} } }
if(attact[max_i][max_j]>=0)
{ cover[max_i][max_j]='*';
attact[max_i][max_j]=-1;
cout< cout if(max_i-1>=0 && max_j-2>=0 )
{ attact[max_i-1][max_j-2] =-1;
int i = max_i-1;
int j = max_j-2;
c.to_attact(i,j);}
if(max_i-2>=0 && max_j-1>=0)
{ attact[max_i-2][max_j-1] =-1;
int i=max_i-2;
int j=max_j-1;
c.to_attact(i,j);}
if(max_i+1= 0)
{ attact[max_i+1][max_j-2] =-1;
int i=max_i+1;
int j=max_j-2;
c.to_attact(i,j);}
if(max_i+2=0)
{ attact[max_i+2][max_j-1] =-1;
int i=max_i+2;
int j=max_j-1;
c.to_attact(i,j);}
if(max_i-1>=0 && max_j+2 { attact[max_i-1][max_j+2] =-1;
int i=max_i-1;
int j=max_j+2;
c.to_attact(i,j);}
if(max_i-2>=0 && max_j+1 { attact[max_i-2][max_j+1]=-1;
int i=max_i-2;
int j=max_j+1;
c.to_attact(i,j);
}
if(max_i+1 { attact[max_i+1][max_j+2] =-1;
int i=max_i+1;
int j=max_j+2;
c.to_attact(i,j);}
if(max_i+2 { attact[max_i+2][max_j+1] =-1;
int i=max_i+2;
int j=max_j+1;
c.to_attact(i,j);}
cout cout for(int i2=0;i2 {for(int j2=0;j2 { cout cout cout cout for(int i3=0;i3 {for(int j3=0;j3 { cout cout }system("pause");}
to_attact(int a,int b)
void chess::to_attact(int a,int b)
{if(a-1>=0&&b-2>=0&&attact[a-1][b-2]!=-1&&attact[a-1][b-2]!=0)
{ attact[a-1][b-2]--;}
if(a-2>=0&&b-1>=0&&attact[a-2][b-1]!=-1 && attact[a-2][b-1]!=0)
{ attact[a-2][b-1]--;}
if(a+1=0 && attact[a+1][b-2]!=-1 && attact[a+1][b-2]!=0)
{ attact[a+1][b-2]--;}
if(a+2=0&&attact[a+2][b-1]!=-1&& attact[a+2][b-1]!=0)
{ attact[a+2][b-1]--;}
if(a-1>=0&&b+2 {attact[a-1][b+2]--;}
if(a-2>=0&&b+1 {attact[a-2][b+1]--;}
if(a+1 { attact[a+1][b+2]--;}
if(a+2 { attact[a+2][b+1]--;} }
1.2.4 get_mincover(chess c)
void chess::get_mincover(chess c)
{ int max_attact = 0;
while(max_attact !=-1)
{ c.get_horse(c); //循环计算最小覆盖;
max_attact =-1.5;//中间变量;判断是否已完成最小覆盖的计算;
for(int i=0;i { for(int j=0;j { if(attact[i][j]>=max_attact)
{max_attact=attact[i][j];
}
} }
} }
/
void main()
{
int M,N,k=0;
int i,j;
printf("请输入棋盘的行数M,列数N:");
scanf("%d,%d",&M,&N);
printf("棋盘的布局是:\n");
printf("________________________________________\n");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
printf(" ");
printf("%d",k);
if(k<10)
printf(" ");
printf("|"); // 0
k++;
}
printf("\n");
printf("________________________________________\n");
}
}
/
chess c;
c.get_attact( );
for(int p=0;p<M;p++)
{ for(int q=0;q<N;q++)
{ cout<<attact[p][q]<<" ";}
cout<<endl; }
c.get_mincover(c);
cout<<endl;}
*/
帮忙把这个改成用C 写的也可以啊,C++好多看不懂,还没学解决 无用评论 打赏 举报
悬赏问题
- ¥15 训练的多模态特征融合模型准确度很低怎么办
- ¥15 kylin启动报错log4j类冲突
- ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
- ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
- ¥15 onvif+openssl,vs2022编译openssl64
- ¥15 iOS 自定义输入法-第三方输入法
- ¥15 很想要一个很好的答案或提示
- ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
- ¥15 怀疑手机被监控,请问怎么解决和防止
- ¥15 Qt下使用tcp获取数据的详细操作