C_and_CPP 板


LINE

遇到的问题: (题意请描述清楚) 我写了一个八皇后程式,但是编译以後执行却完全没东西, 可否请板上各位高手帮我看一下,谢谢 希望得到的正确结果: 八皇后的解 程式跑出来的错误结果: 完全不会动... 开发平台: Dev-c++ 4.9.9.2 有问题的code: (请善用置底文标色功能) #include<iostream> using std::cout; using std::endl; int count(int,int); void setchessboard(); int findmin(); int findminadd(); int putqueen(int,int,int,int); int setblock(int,int); void printchessboard(); void removequeen(int,int); void resetchessboard(); int chessboard[8][8]; int countsolnumber=1; int main() { resetchessboard(); int x1,x2,x3,x4,x5,x6,x7,x8; int y1,y2,y3,y4,y5,y6,y7,y8; int z1,z2,z3,z4,z5,z6,z7,z8; for(x1=0;x1<=7;x1++) for(y1=0;y1<=7;y1++) {z1=putqueen(x1,y1,0,0); if(z1==2) {for(x2=0;x2<=7;x2++) for(y2=0;y2<=7;y2++) {z2=putqueen(x2,y2,x1,y1); if(z2==2) {for(x3=0;x3<=7;x3++) for(y3=0;y3<=7;y3++) {z3=putqueen(x3,y3,x2,y2); if(z3==2) {for(x4=0;x4<=7;x4++) for(y4=0;y4<=7;y4++) {z4=putqueen(x4,y4,x3,y3); if(z4==2) {for(x5=0;x5<=7;x5++) for(y5=0;y5<=7;y5++) {z5=putqueen(x5,y5,x4,y4); if(z5==2) {for(x6=0;x6<=7;x6++) for(y6=0;y6<=7;y6++) {z6=putqueen(x6,y6,x5,y5); if(z6==2) {for(x7=0;x7<=7;x7++) for(y7=0;y7<=7;y7++) {z7=putqueen(x7,y7,x6,y6); if(z7==2) {for(x8=0;x8<=7;x8++) for(y8=0;y8<=7;y8++) {z8=putqueen(x8,y8,x7,y7); if(z8==3) continue; else continue; } } else continue;} } else continue;} } else continue;} } else continue;} } else continue;} } else continue;} } else continue;} getchar(); return 0; } int count(int i,int j) { int a,b,c=0,d; for(a=0;a<=7;a++) for(b=0;b<=7;b++) { for(d=1;d<=8;d++) {if((chessboard[a][b]!=1)&&(chessboard[a][b]!=100)&&(a==i-d)&&(b==j-d)) c+=1; else if((chessboard[a][b]!=1)&&(chessboard[a][b]!=100)&&(a==i+d)&&(b==j-d)) c+=1; else if((chessboard[a][b]!=1)&&(chessboard[a][b]!=100)&&(a==i-d)&&(b==j+d)) c+=1; else if((chessboard[a][b]!=1)&&(chessboard[a][b]!=100)&&(a==i+d)&&(b==j+d)) c+=1; else continue; } if((chessboard[a][b]!=1)&&(chessboard[a][b]!=100)&&((a==i)||(b==j))) c+=1; else continue; } return c; } int findmin() { int e,f,min=1000; for(e=0;e<=7;e++) for(f=0;f<=7;f++) {if((chessboard[e][f]!=1)&&(chessboard[e][f]!=0)&&(chessboard[e][f]<min)) min=chessboard[e][f]; else continue; } if(min==1000) return -1; else return min; } int findminadd() { int g,h,k=0; if(findmin()!=-1) {for(g=0;g<=7;g++) for(h=0;h<=7;h++) {if(chessboard[g][h]==findmin()) k+=1; else continue; } return k; } else return -1; } int setblock(int s1,int s2) { int sb1,sb2,sb3; for(sb1=0;sb1<=7;sb1++) for(sb2=0;sb2<=7;sb2++) {if(chessboard[sb1][sb2]!=100) {chessboard[s1][sb2]=1; chessboard[sb1][s2]=1;} for(sb3=1;sb3<=8;sb3++) { if(((sb1-sb3)>=0)&&((sb2-sb3)>=0)) chessboard[(sb1-sb3)][(sb2-sb3)]=1; else if(((sb1+sb3)<=7)&&((sb2-sb3)>=0)) chessboard[(sb1+sb3)][(sb2-sb3)]=1; else if(((sb1-sb3)>=0)&&((sb2+sb3)<=7)) chessboard[(sb1-sb3)][(sb2+sb3)]=1; else if(((sb1+sb3)<=7)&&((sb2+sb3)<=7)) chessboard[(sb1+sb3)][(sb2+sb3)]=1; else continue; } } return 0; } int putqueen(int pq1,int pq2,int pq3,int pq4) { static int queen=0; int k=findminadd(); if((k>=(8-queen))&&(queen<8)) { chessboard[pq1][pq2]=100; setblock(pq1,pq2); queen+=1; return 2;} if(queen==8) {printchessboard(); countsolnumber+=1; queen=0; return 3;} if((k<queen)&&(queen!=8)) { removequeen(pq3,pq4); queen-=1; return 4;} } void removequeen(int rq1,int rq2) { chessboard[rq1][rq2]=0; int m,n,o; for(m=0;m<=7;m++) for(n=0;n<=7;n++) { chessboard[rq1][m]=0; chessboard[n][rq2]=0; for(o=1;o<=8;o++) { if(((rq1-o)>=0)&&((rq2-o)>=0)) chessboard[(rq1-o)][(rq2-o)]=0; else if(((rq1+o)<=7)&&((rq2-o)>=0)) chessboard[(rq1+o)][(rq2-o)]=0; else if(((rq1-o)>=0)&&((rq2+o)<=7)) chessboard[(rq1-o)][(rq2+o)]=0; else if(((rq1+o)<=7)&&((rq2+o)<=7)) chessboard[(rq1+o)][(rq2+o)]=0; else continue; } } setchessboard(); } void printchessboard() { cout<<"--"<<endl; cout<<"第"<<countsolnumber<<"组解\n\n"; cout<<"皇后的位置\n"<<"1.以坐标表示为:"<<endl; int p0,p1,p2,p3; for(p1=0;p1<=7;p1++) for(p2=0;p2<=7;p2++) { if(chessboard[p1][p2]==100) cout<<"<"<<p1<<","<<p2<<">\t"; } cout<<endl; cout<<"2.以图形表示:"<<endl; cout<<" "; for(p0=0;p0<=7;p0++) {cout<<p0<<" "; } cout<<endl; for(p1=0;p1<=7;p1++) for(p2=0;p2<=7;p2++) { if((p2==0)&&(p2!=7)&&(chessboard[p1][7]!=100)) cout<<p1<<" "; else if(((p2==0)&&p2!=7)&&(chessboard[p1][7]==100)) cout<<p1<<" Q "; else if ((p2!=0)&&(p2==7)&&(chessboard[p1][7]!=100)) cout<<" "<<endl; else if ((p2!=0)&&(p2==7)&&(chessboard[p1][7]==100)) cout<<"Q"<<endl; else if ((p2!=0)&&(p2!=7)&&(chessboard[p1][7]==100)) cout<<"Q "; else cout<<" "; } } void resetchessboard() { int re1,re2; for(re1=0;re1<=7;re1++) for(re2=0;re2<=7;re2++) {chessboard[re1][re2]=0; } setchessboard(); } void setchessboard() { int set1,set2; for(set1=0;set1<=7;set1++) for(set2=0;set2<=7;set2++) {chessboard[set1][set2]=count(set1,set2); } } 补充说明: 说一下我的想法 1.假设皇后放在一个格子之中,则他可以吃到的格子数目全部加起来 写在那一个格子里头,然後去求所有格子的最小值,把皇后放在那个最小值里面 然後把它可以吃掉的格子设为1,再去求剩下不能吃掉的格子的最小值, 然後再放第二个皇后,以此类推下去,放皇后的方法就是那些是最小值的格子 一个一个去试,如果走到死路的话,就把最後一次放皇后的格子的格子的皇后拿掉 ,重新设定最小值,再把皇后放在下一个格子,一直到找到解为止 2. chseeboard[][]是棋盘,设为8*8的阵列 3.函式的功能 a.resetchessboard() 就是把整个棋盘设为初始的状态,也就是完全没放皇后的状态 b.setchessboard() 设定棋盘,就是把格子的最小值放上去 c.count() 找出格子的值 d.findmin() 找出格子最小值 e.findminadd() 找出格子是最小值的个数 f.setblock() 就是把皇后放上去之後,把会被皇后吃掉的格子都设为1 g.putqueen() 把皇后放上去,或是判断是否找到解,或是判断是不是要移除皇后的地方 h.removequeen() 把皇后移掉,被移掉的格子汗如果皇后在那个格子的话会被吃掉的格子都设0 i.prinntchessboard() 就是把解印出来的函式 4.题目出处: C++: How to program, 6/e 中文版叫做:c++程式设计的艺术 第五版,题目一样 7.34题 麻烦各位大大解答了 小弟我已经熬夜两天debug不出来... 感激不尽... --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.211.19 ※ 编辑: pocernld 来自: 140.112.211.19 (12/12 02:23)
1F:推 ducksteven:好...好多层 囧 12/12 02:45
2F:→ yoco315:艺术品阿....... 12/12 03:32
3F:推 powertodream:好恐怖的code....@@" 12/12 04:08
4F:推 legendmtg:看不懂... 12/12 04:22
5F:推 joefaq:啧啧 好多层... 12/12 05:33
6F:推 abyss02wang:天。.天阿@@ 12/12 05:36
7F:推 soniclin:世界奇观! 12/12 05:45
8F:推 LPH66:一看就知道是那种很壮观的code (视觉上) 12/12 05:50
9F:推 dexders:u win!! 12/12 05:55
10F:推 joefaq:你可以去Google一下别人怎麽写的 不要只看一份 12/12 06:15
11F:→ devilarise:这是for回圈叠叠乐吗? @o@ 12/12 07:03
12F:推 StubbornLin:靠~ 好屌~ XDDD 12/12 07:57
13F:推 StubbornLin:这种程式如果能debug的话 那还真的超强的 XD 12/12 08:02
14F:→ remmurds:也难怪原PO会debug两天de不出来了... 12/12 08:40
15F:推 tyc5116:我想....应该得不到答案吧...@@ 12/12 10:09
16F:→ tyc5116:应该要先试着简化才对....@@ 12/12 10:10
17F:→ ianfang:这种恐怖的东西只有你自己有办法debug吧... 12/12 10:48
18F:→ ianfang:你应该花两天时间熬夜写新写法比较快 真的... 12/12 10:49
19F:推 netsphere:推 原PO的耐心跟毅力 12/12 10:50
20F:→ netsphere:不过下次如果要写 sudoku 那最好不要这样写 XD 12/12 10:53
21F:推 hilorrk:糟了! 是世界奇观! 12/12 10:53
22F:推 YCK:@@ 那个形状.... 12/12 10:55
23F:推 johnlinvc:娘子....快跟牛魔王一起出来看世界奇观 12/12 11:10
24F:推 snowlike:1st执行的setblock就有问题,除很有自信应该要测试副函式 12/12 11:18
25F:→ snowlike:哦对了不是不会动,是跑完了.. 12/12 11:21
26F:推 tw00088437:还好不是我写的 不然我的对齐方式看了一定会更崩溃xd 12/12 11:59
27F:推 pizza0117:你可以先参考这篇 http://0rz.tw/791sL 12/12 12:03
28F:推 yoco315:小弟发自内心深处的建议:砍掉重练 qq 12/12 12:22
29F:→ yoco315:对了 @@ 重练得时候记得先写 2q 跟 4q 比较小的版本.. 12/12 12:31
30F:推 deepking:壮观 砍掉重练+1... 12/12 12:43
31F:推 twotwoone:奇才啊 12/12 13:07
32F:推 ktta:看到头晕 XD 12/12 13:57
33F:推 freesamael:真的是世界奇观阿XD 12/12 14:04
34F:推 dendrobium:我笑了XD 12/12 14:28
35F:→ nowar100:我好想m起来 真的太酷了 XD 12/12 15:30
36F:推 holymars:糟了!是世界奇观! 12/12 16:18
37F:→ sunneo:for for for for (霍霍霍... 12/12 17:37
38F:→ sunneo:你要不要改用listener mode/Message driven来写 12/12 17:38
39F:→ pocernld:小弟才疏学浅 刚学不久 只会用一些简单的指令 12/12 17:56
40F:→ pocernld:还麻烦各位大大指教了 感激不尽... 12/12 17:56
41F:→ final01:GJ 12/12 18:12
42F:推 deepking:http://ppt.cc/e6hh 12/12 18:12
43F:推 Domos:想必原po是天生的coding奇才,将来成功必定是指日可待 12/12 18:36
44F:推 ducksteven:刚学就敢挑战八皇后问题,的确很有勇气! 12/12 18:47
45F:→ bugmans:新手常常越级打怪,话说18043的那位新手怎麽没无名的消息了 12/12 19:47
46F:→ eva19452002:你的code已经可以纳入教科书的新手coding style范例了 12/12 20:12
47F:推 wa120:我还没挑战过这麽多for回圈 12/12 20:48
48F:推 avhacker:给原 PO: 你应该忘掉 8 这个数字,想想 N 皇后问题 12/12 22:18
49F:推 newnovice:你code上瘾了XD 12/12 22:27
50F:推 softwind:厉害 世界奇观... 小弟佩服 @@" 12/12 22:46
51F:推 hrs113355:XDDDDDD 12/12 23:20
52F:推 softwind:我光看 这要复制贴上改变数 我就觉得累了 还是给 "推" 12/12 23:25
53F:推 jerry54010: XDDD 12/12 23:31
54F:推 jimmyken793:XDDD 12/12 23:54
55F:推 siriusu:我笑了 不过说真的 蚂蚁书就是超早就给八皇后的题目 12/13 00:09
56F:推 ADF:囧 12/13 00:26
57F:推 legendmtg:竟然被转in2了XDD 12/13 00:58
58F:推 blackwindy:我记得我第一次写这个没超过30行的样子...不过不是C... 12/13 01:52
59F:推 YCK:蚂蚁书的八皇后好像在阵列那一章? 还有骑士旅行 有趣的题目~ 12/13 08:11
60F:推 StubbornLin:这就是所谓的结构化程式设计 请看那精美的金字塔结构 12/13 08:12
61F:→ StubbornLin:(误) 12/13 08:12
62F:推 Tidus0000:那个for... XDDDDDDDDDDDDDDD 12/13 10:29
63F:推 p221071889:那个for实在是太威了 12/13 10:53
64F:→ kenzou:娘子,快和牛魔王出来看上帝! (烟 12/13 11:24
65F:推 lwecloud:forforforfor~~forforforfor~~for家拳的套路招式灵活 12/13 11:25
66F:推 conan77420:这应该要列入教课书的经典范例中XD 12/13 11:29
67F:推 WalkingIce:炫耀文呀!! 12/13 12:35
68F:推 coronach:真的 请你思考一下N皇后怎麽写... 12/13 13:08
69F:推 kewang:............16层的for loop 囧 12/13 13:15
70F:推 GGPlay:经典,如果方法太长就有坏code的味道了,楼主可以把程式的 12/13 13:59
71F:→ GGPlay:概念抽象化成函数,这样可以简化问题也比较好debug 12/13 13:59
72F:推 frankvv:可以练习算最内圈的big-O XD 12/13 16:34
73F:推 legnaleurc:糟了!是世界奇观! 12/13 17:44
74F:推 andyjy12:看了一直笑XDDD 12/13 18:42
75F:推 walker2009:我也笑了XDDD 12/13 23:37
76F:推 dsin:看到for for我就PAGE DOWN去看推文了 XD 12/14 00:52
77F:推 luccifero:朝圣推 12/14 00:59
78F:推 a83294:当初写到这个也有想过这样写....只不过一想到写这麽回圈 12/14 06:23
79F:→ a83294:就直接放弃找新解法了.....原PO真的很有心 12/14 06:23
80F:推 dp2:wa... 12/14 19:34
oxoxpeter:转录至看板 StupidClown 12/14 20:21
81F:推 mynoid:笑到不能自己,哈哈哈哈~~~~ 12/14 21:45
82F:推 Hevak:超强大的for家拳wwww 12/14 22:21
83F:推 ray521:天啊 好强大的笑点程式XDDD 12/14 23:17
84F:推 walker2009:笑完之後发现原po可能还是不知道怎麽写 12/15 01:08
85F:→ walker2009:http://paste.plurk.com/show/103673/ 12/15 01:08
86F:→ walker2009:随手写了个DFS版本, 应该不难理解, 还蛮暴力就是了 12/15 01:09
87F:→ walker2009:原po加油XD 12/15 01:09
88F:→ pocernld:恩恩谢谢楼上大大 借参考一下~ 12/15 01:18
89F:推 sunhextfn: 朝圣推 02/15 23:16
90F:推 issuemylove: 朝圣 03/05 17:45
91F:推 ronin728: 经典旧文朝圣 03/15 22:28
92F:→ Colop: for 奇观 03/16 20:03
93F:推 deangood01: 2016朝圣 05/18 14:31







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP