当前位置: 代码迷 >> C语言 >> [求助]恐怖啊,好像陷入无限递归,大家帮忙看看。
  详细解决方案

[求助]恐怖啊,好像陷入无限递归,大家帮忙看看。

热度:314   发布时间:2005-02-21 12:40:00.0
[求助]恐怖啊,好像陷入无限递归,大家帮忙看看。

我正在用程序解一道题目,题目是这样的: 国际象棋棋盘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编辑过]

搜索更多相关的解决方案: int  递归  国际象棋  square  sum  

----------------解决方案--------------------------------------------------------
你机器运算慢.....我猜的哦
----------------解决方案--------------------------------------------------------

#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)函数赋值有问题 我不知你想怎赋值!!! 我不会改 但你好像有些循环是无用的! 说错不要见怪!!


----------------解决方案--------------------------------------------------------
  相关解决方案