我正在用程序解一道题目,题目是这样的: 国际象棋棋盘8*8方格国际象棋棋盘8*8方格表中,每个要填入1、2、3这三个数字之中的任意一个。是否存在一种填入方式,使每行、每列及两条对角线上八个数字之和各不相等? 以下是我的程序,请大家帮我看看为什么程序运行后长时间无响应却没有“栈溢出”的错误,是不是程序上有问题啊? #include <iostream> #include <iomanip>
using namespace std;
int sum_row(int square[][8],int i); int sum_col(int square[][8],int i);
bool judge(int square[][8]);
void print_square(int suqare[][8]); void gen_square(int square[][8],int i,int j);
void main() { int square[8][8]={0}; gen_square(square,0,0); }
int sum_row(int square[][8],int i) { int j; int sum=0; for(j=0;j<8;j++) { sum += square[i][j]; } return sum; }
int sum_col(int square[][8],int i) { int j; int sum=0; for(j=0;j<8;j++) { sum += square[j][i]; } return sum; }
int sum_left_corner(int square[][8]) { int i,j=0; int sum=0; for(i=0;i<8;i++) { sum += square[i][j]; j++; } return sum; }
int sum_right_conrner(int square[][8]) { int i,j=0; int sum=0; for(i=7;i>=0;i--) { sum += square[j][i]; j++; } return sum; }
void print_square(int square[][8]) { int i,j; for(i=0;i<8;i++) { for(j=0;j<8;j++) { cout << setw(4) << square[i][j]; } cout << endl; } cout << endl; }
bool judge(int square[][8]) { int i,j=0; bool result=true; int sum[18]={0}; for(i=0;i<8;i++) { sum[2*j] = sum_row(square,i); sum[2*j+1] = sum_col(square,i); j++; } sum[16] = sum_left_corner(square); sum[17] = sum_left_corner(square);
for(i=0;i<17;i++) { for(j=i+1;j<18;j++) { if(sum[i] == sum[j]) { result=false; break; } } if(!result) { break; } }
return result; }
void gen_square(int square[][8],int i,int j) { if(i < 8 && j < 8) { int k; for(k=1;k<4;k++) { square[i][j] = k; if(j < 8) j++; else { if (i < 8) { i++; j = 0; } } gen_square(square,i,j); } } else { if(judge(square)) { print_square(square); } } }
[此贴子已经被作者于2005-2-21 13:28:22编辑过]
----------------解决方案--------------------------------------------------------
你机器运算慢.....我猜的哦
----------------解决方案--------------------------------------------------------
#include <stdio.h> #include <conio.h>
#define COL 8
int sum_row(int square[][COL],int i); int sum_col(int square[][COL],int i); int sum_left_corner(int square[][COL]); int sum_right_corner(int square[][COL]);
int judge_equal(int square[][COL]);
void print_square(int square[][COL]); void convert_square(int box[],int square[][COL]); void gen_square(int box[],int pos,int size);
int total;
void main() { int box[COL*COL]={0}; total=0; gen_square(box,0,COL*COL); printf("Total=%d\n",total);
getch(); }
int sum_row(int square[][COL],int i) { int j; int sum=0; for(j=0;j<COL;j++) { sum+=square[i][j]; } return sum; }
int sum_col(int square[][COL],int i) { int j; int sum=0; for(j=0;j<COL;j++) { sum+=square[j][i]; } return sum; }
int sum_left_corner(int square[][COL]) { int i,j=0; int sum=0; for(i=0;i<COL;i++) { sum+=square[i][j]; j++; } return sum; }
int sum_right_corner(int square[][COL]) { int i,j=0; int sum=0; for(i=COL-1;i>=0;i--) { sum+=square[j][i]; j++; } return sum; }
int judge_equal(int square[][COL]) { int i,j=0; int sum[COL*2+2]; int result=1; for(i=0;i<COL;i++) { sum[2*j]=sum_row(square,i); sum[2*j+1]=sum_col(square,i); j++; }
sum[COL*2+1]=sum_left_corner(square); sum[COL*2+2]=sum_right_corner(square);
for(i=0;i<COL*2+1;i++) { for(j=i+1;j<COL*2+2;j++) { if(sum[i]==sum[j]) { result=0; break; } } if(result==0) { break; } }
return result; }
void print_square(int square[][COL]) { int i,j; for(i=0;i<COL;i++) { for(j=0;j<COL;j++) { printf("%4d",square[i][j]); } printf("\n"); } }
void convert_square(int box[],int square[][COL]) { int i,j,k=0; for(i=0;i<COL;i++) { for(j=0;j<COL;j++) { square[i][j]=box[k]; k++; } } }
void gen_square(int box[],int pos,int size) { if(pos>=0 && pos<size) { int i; for(i=1;i<=3;i++) { box[pos]=i; pos++; gen_square(box,pos,size); pos--; } } else if(pos >= size) { int square[COL][COL]={0}; convert_square(box,square);
if(judge_equal(square)) { print_square(square); printf("\n"); total++; } } } 我做了个新的算法,还是没完没了的递归,就是不出结果。。。。。。。。。。哎。。。。。该怎样才能提高速度。。
----------------解决方案--------------------------------------------------------
3^64 约为 3.4*10^30,穷举是不行的...
----------------解决方案--------------------------------------------------------
貌似是无解的吧?
8个1到8个3,可以出现的和也就8,9,10,...,24一共17个。
但横竖各8个,加上2个对角线有18个数字。
----------------解决方案--------------------------------------------------------
那有没有效率更高一点的方法呢?谢谢。。。
----------------解决方案--------------------------------------------------------
...已经知道不会有解了,还用算吗?
----------------解决方案--------------------------------------------------------
哦,我理解了,谢谢你啊。。。。。
----------------解决方案--------------------------------------------------------
太长了
没有那么多的时间看完
所以带回家去慢慢研究
----------------解决方案--------------------------------------------------------
第一个程式有几处不理解 第一bool judge(int square[][8])你想这个函数怎对比我改成 bool judge(int square[][8]) { int i,j=0; bool result=true;
int sum[18]={0}; for(i=0;i<8;i++) { sum[2*j] = sum_row(square,i); sum[2*j+1] = sum_col(square,i); j++; } sum[16] = sum_left_corner(square); sum[17] = sum_left_corner(square);
for(i=0;i<14;i++) { for(j=i+1;j<16;j++) { if(sum[i] == sum[j]&&sum[16]==sum[17]) result=false;
} } return result; } 行和跟行和对,比对角再对比; 第二void gen_square(int square[][8],int i,int j)函数赋值有问题 我不知你想怎赋值!!! 我不会改 但你好像有些循环是无用的! 说错不要见怪!!
----------------解决方案--------------------------------------------------------