请大神帮忙设计一个完整的c语言程序,要求实现”在4乘4的棋盘上放置8个棋,要求每一行每一列上只能放置2个”调试成功后给分
楼主你好。见丑了。。我用了一个穷举的方法。我写的代码的好处在于易于扩展,N代表了棋盘的大小,你可以任意修改,不止是4。
【经过几次优化后变为以下代码,采用回溯法】
#include <stdio.h>
#include <stdlib.h>
#define N 6
#define NOPRINTING //标志是否打印数组
//如果只是计算可能的情况的话,根本不需要N×N的棋盘数组。
void printMatrix(int* matrix, int m, int n){
int i,j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%d ",matrix[n*i+j]);
}
printf("\n");
}
}
void recusion(int* chessBoard, int n, int iter, int* count, int* col){
int i,j;
#ifndef NOPRINTING
int* currentRow = &chessBoard[n*(n-iter)];
#endif
if(iter == 0){
(*count)++;
#ifndef NOPRINTING
printMatrix(chessBoard, n, n);
printf("===============================\n");
#endif
return;
}
for(i=0;i<n-1;i++){//布置每行第一个棋子
for(j=i+1;j<咐逗圆n;j++){//布置每行第二衡塌个棋子
#ifndef NOPRINTING
currentRow[i]=currentRow[j]=1;//重写当前行
#endif
if(col[i]+1 <=2 && col[j]+1 <=2){//有效
col[i]++;
col[j]++;
recusion(chessBoard, n, iter-1, count, col);//若当前仍满足要求,对下一行进行递归。
col[i]--;
col[j]--;
}
#ifndef NOPRINTING
currentRow[i]=currentRow[j]=0;//清空当前行
#endif
}
}
}
void putChess(int* chessBoard, int n, int* count){
int* col=(int*)calloc(1,sizeof(int)*n);//标记每一列放置的棋子数
recusion(chessBoard, n, n, count, col);
free(col);
}
void main(){
int count=0;
int chessBoard[N][N]={0};
printf("==========START TO PUT CHESS!===========\n");
putChess((int*)chessBoard, N, &count);
printf("All %d possible deploy!\n", count);
}
输出:
【N为3且选择打印】
==========START TO PUT CHESS!===========
1 1 0
1 0 1
0 1 1
===============================
1 1 0
0 1 1
1 0 1
===============================
1 0 1
1 1 0
0 1 1
===============================
1 0 1
0 1 1
1 1 0
===============================
0 1 1
1 1 0
1 0 1
===============================
0 1 1
1 0 1
1 1 0
===============================
All 6 possible deploy!
Press any key to continue
【N为8的时候,有近两亿种情况,指野花了将近一分钟的时间算完。】
==========START TO PUT CHESS!===========
All 187530840 possible deploy!
Press any key to continue
要列出所有情况?
不现实吧此仿,太多了,算出有几种还可以
只要一种那你直接指定位置就行扒磨好了啊
比如:档斗a[0][0] ,a[0][1],
a[1][0] ,a[1][1],
a[2][2] ,a[2][3],
a[3][2] ,a[3][3],
编的话我应该会,你说的
数学情况我不大懂
是说每行列最多两个,还是都要有两个呢?
情况比较复杂,最好从每行每列放一个开始吧。
只是纯粹的放置标志量么?有没有
游戏规则什么的