| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1408 人关注过本帖
标题:[求助]恐怖啊,好像陷入无限递归,大家帮忙看看。
只看楼主 加入收藏
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
 问题点数:0 回复次数:11 
[求助]恐怖啊,好像陷入无限递归,大家帮忙看看。

我正在用程序解一道题目,题目是这样的: 国际象棋棋盘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 
2005-02-21 12:40
奇牙
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2005-1-31
收藏
得分:0 
你机器运算慢.....我猜的哦

printf(\"路漫漫其修远兮,吾将上下而求所!\")
2005-02-21 18:03
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 

#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++; } } } 我做了个新的算法,还是没完没了的递归,就是不出结果。。。。。。。。。。哎。。。。。该怎样才能提高速度。。


我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-02-21 18:06
kaikai
Rank: 1
等 级:新手上路
帖 子:236
专家分:0
注 册:2005-1-7
收藏
得分:0 
3^64 约为 3.4*10^30,穷举是不行的...

Have you visit acm.tongji. lately?
2005-02-21 20:28
kaikai
Rank: 1
等 级:新手上路
帖 子:236
专家分:0
注 册:2005-1-7
收藏
得分:0 
貌似是无解的吧?
8个1到8个3,可以出现的和也就8,9,10,...,24一共17个。
但横竖各8个,加上2个对角线有18个数字。

Have you visit acm.tongji. lately?
2005-02-21 20:38
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
那有没有效率更高一点的方法呢?谢谢。。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-02-22 09:24
kaikai
Rank: 1
等 级:新手上路
帖 子:236
专家分:0
注 册:2005-1-7
收藏
得分:0 
...已经知道不会有解了,还用算吗?

Have you visit acm.tongji. lately?
2005-02-22 18:53
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
哦,我理解了,谢谢你啊。。。。。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2005-02-22 19:06
冰河2004
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2004-12-22
收藏
得分:0 
太长了

没有那么多的时间看完

所以带回家去慢慢研究
2005-03-21 19:57
happyocean
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2005-3-24
收藏
得分:0 

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


2005-04-02 09:55
快速回复:[求助]恐怖啊,好像陷入无限递归,大家帮忙看看。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013157 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved