[問題] 請問一下我的八皇后程式

看板C_and_CPP (C/C++)作者 (時間像流水般過去了...)時間15年前 (2009/12/12 02:21), 編輯推噓67(67026)
留言93則, 69人參與, 最新討論串1/3 (看更多)
遇到的問題: (題意請描述清楚) 我寫了一個八皇后程式,但是編譯以後執行卻完全沒東西, 可否請板上各位高手幫我看一下,謝謝 希望得到的正確結果: 八皇后的解 程式跑出來的錯誤結果: 完全不會動... 開發平台: 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)

12/12 02:45, , 1F
好...好多層 囧
12/12 02:45, 1F

12/12 03:32, , 2F
藝術品阿.......
12/12 03:32, 2F

12/12 04:08, , 3F
好恐怖的code....@@"
12/12 04:08, 3F

12/12 04:22, , 4F
看不懂...
12/12 04:22, 4F

12/12 05:33, , 5F
嘖嘖 好多層...
12/12 05:33, 5F

12/12 05:36, , 6F
天。.天阿@@
12/12 05:36, 6F

12/12 05:45, , 7F
世界奇觀!
12/12 05:45, 7F

12/12 05:50, , 8F
一看就知道是那種很壯觀的code (視覺上)
12/12 05:50, 8F

12/12 05:55, , 9F
u win!!
12/12 05:55, 9F

12/12 06:15, , 10F
你可以去Google一下別人怎麼寫的 不要只看一份
12/12 06:15, 10F

12/12 07:03, , 11F
這是for迴圈疊疊樂嗎? @o@
12/12 07:03, 11F

12/12 07:57, , 12F
靠~ 好屌~ XDDD
12/12 07:57, 12F

12/12 08:02, , 13F
這種程式如果能debug的話 那還真的超強的 XD
12/12 08:02, 13F

12/12 08:40, , 14F
也難怪原PO會debug兩天de不出來了...
12/12 08:40, 14F

12/12 10:09, , 15F
我想....應該得不到答案吧...@@
12/12 10:09, 15F

12/12 10:10, , 16F
應該要先試著簡化才對....@@
12/12 10:10, 16F

12/12 10:48, , 17F
這種恐怖的東西只有你自己有辦法debug吧...
12/12 10:48, 17F

12/12 10:49, , 18F
你應該花兩天時間熬夜寫新寫法比較快 真的...
12/12 10:49, 18F

12/12 10:50, , 19F
推 原PO的耐心跟毅力
12/12 10:50, 19F

12/12 10:53, , 20F
不過下次如果要寫 sudoku 那最好不要這樣寫 XD
12/12 10:53, 20F

12/12 10:53, , 21F
糟了! 是世界奇觀!
12/12 10:53, 21F

12/12 10:55, , 22F
@@ 那個形狀....
12/12 10:55, 22F

12/12 11:10, , 23F
娘子....快跟牛魔王一起出來看世界奇觀
12/12 11:10, 23F

12/12 11:18, , 24F
1st執行的setblock就有問題,除很有自信應該要測試副函式
12/12 11:18, 24F

12/12 11:21, , 25F
哦對了不是不會動,是跑完了..
12/12 11:21, 25F

12/12 11:59, , 26F
還好不是我寫的 不然我的對齊方式看了一定會更崩潰xd
12/12 11:59, 26F

12/12 12:03, , 27F
你可以先參考這篇 http://0rz.tw/791sL
12/12 12:03, 27F

12/12 12:22, , 28F
小弟發自內心深處的建議:砍掉重練 qq
12/12 12:22, 28F

12/12 12:31, , 29F
對了 @@ 重練得時候記得先寫 2q 跟 4q 比較小的版本..
12/12 12:31, 29F

12/12 12:43, , 30F
壯觀 砍掉重練+1...
12/12 12:43, 30F

12/12 13:07, , 31F
奇才啊
12/12 13:07, 31F

12/12 13:57, , 32F
看到頭暈 XD
12/12 13:57, 32F

12/12 14:04, , 33F
真的是世界奇觀阿XD
12/12 14:04, 33F

12/12 14:28, , 34F
我笑了XD
12/12 14:28, 34F

12/12 15:30, , 35F
我好想m起來 真的太酷了 XD
12/12 15:30, 35F

12/12 16:18, , 36F
糟了!是世界奇觀!
12/12 16:18, 36F

12/12 17:37, , 37F
for for for for (霍霍霍...
12/12 17:37, 37F

12/12 17:38, , 38F
你要不要改用listener mode/Message driven來寫
12/12 17:38, 38F

12/12 17:56, , 39F
小弟才疏學淺 剛學不久 只會用一些簡單的指令
12/12 17:56, 39F

12/12 17:56, , 40F
還麻煩各位大大指教了 感激不盡...
12/12 17:56, 40F

12/12 18:12, , 41F
GJ
12/12 18:12, 41F

12/12 18:12, , 42F
12/12 18:12, 42F

12/12 18:36, , 43F
想必原po是天生的coding奇才,將來成功必定是指日可待
12/12 18:36, 43F

12/12 18:47, , 44F
剛學就敢挑戰八皇后問題,的確很有勇氣!
12/12 18:47, 44F

12/12 19:47, , 45F
新手常常越級打怪,話說18043的那位新手怎麼沒無名的消息了
12/12 19:47, 45F

12/12 20:12, , 46F
你的code已經可以納入教科書的新手coding style範例了
12/12 20:12, 46F

12/12 20:48, , 47F
我還沒挑戰過這麼多for迴圈
12/12 20:48, 47F

12/12 22:18, , 48F
給原 PO: 你應該忘掉 8 這個數字,想想 N 皇后問題
12/12 22:18, 48F

12/12 22:27, , 49F
你code上癮了XD
12/12 22:27, 49F

12/12 22:46, , 50F
厲害 世界奇觀... 小弟佩服 @@"
12/12 22:46, 50F

12/12 23:20, , 51F
XDDDDDD
12/12 23:20, 51F

12/12 23:25, , 52F
我光看 這要複製貼上改變數 我就覺得累了 還是給 "推"
12/12 23:25, 52F

12/12 23:31, , 53F
XDDD
12/12 23:31, 53F

12/12 23:54, , 54F
XDDD
12/12 23:54, 54F

12/13 00:09, , 55F
我笑了 不過說真的 螞蟻書就是超早就給八皇后的題目
12/13 00:09, 55F

12/13 00:26, , 56F
12/13 00:26, 56F

12/13 00:58, , 57F
竟然被轉in2了XDD
12/13 00:58, 57F

12/13 01:52, , 58F
我記得我第一次寫這個沒超過30行的樣子...不過不是C...
12/13 01:52, 58F

12/13 08:11, , 59F
螞蟻書的八皇后好像在陣列那一章? 還有騎士旅行 有趣的題目~
12/13 08:11, 59F

12/13 08:12, , 60F
這就是所謂的結構化程式設計 請看那精美的金字塔結構
12/13 08:12, 60F

12/13 08:12, , 61F
(誤)
12/13 08:12, 61F

12/13 10:29, , 62F
那個for... XDDDDDDDDDDDDDDD
12/13 10:29, 62F

12/13 10:53, , 63F
那個for實在是太威了
12/13 10:53, 63F

12/13 11:24, , 64F
娘子,快和牛魔王出來看上帝! (煙
12/13 11:24, 64F

12/13 11:25, , 65F
forforforfor~~forforforfor~~for家拳的套路招式靈活
12/13 11:25, 65F

12/13 11:29, , 66F
這應該要列入教課書的經典範例中XD
12/13 11:29, 66F

12/13 12:35, , 67F
炫耀文呀!!
12/13 12:35, 67F

12/13 13:08, , 68F
真的 請你思考一下N皇后怎麼寫...
12/13 13:08, 68F

12/13 13:15, , 69F
............16層的for loop 囧
12/13 13:15, 69F

12/13 13:59, , 70F
經典,如果方法太長就有壞code的味道了,樓主可以把程式的
12/13 13:59, 70F

12/13 13:59, , 71F
概念抽象化成函數,這樣可以簡化問題也比較好debug
12/13 13:59, 71F

12/13 16:34, , 72F
可以練習算最內圈的big-O XD
12/13 16:34, 72F

12/13 17:44, , 73F
糟了!是世界奇觀!
12/13 17:44, 73F

12/13 18:42, , 74F
看了一直笑XDDD
12/13 18:42, 74F

12/13 23:37, , 75F
我也笑了XDDD
12/13 23:37, 75F

12/14 00:52, , 76F
看到for for我就PAGE DOWN去看推文了 XD
12/14 00:52, 76F

12/14 00:59, , 77F
朝聖推
12/14 00:59, 77F

12/14 06:23, , 78F
當初寫到這個也有想過這樣寫....只不過一想到寫這麼迴圈
12/14 06:23, 78F

12/14 06:23, , 79F
就直接放棄找新解法了.....原PO真的很有心
12/14 06:23, 79F

12/14 19:34, , 80F
wa...
12/14 19:34, 80F
oxoxpeter:轉錄至看板 StupidClown 12/14 20:21

12/14 21:45, , 81F
笑到不能自己,哈哈哈哈~~~~
12/14 21:45, 81F

12/14 22:21, , 82F
超強大的for家拳wwww
12/14 22:21, 82F

12/14 23:17, , 83F
天啊 好強大的笑點程式XDDD
12/14 23:17, 83F

12/15 01:08, , 84F
笑完之後發現原po可能還是不知道怎麼寫
12/15 01:08, 84F

12/15 01:08, , 85F

12/15 01:09, , 86F
隨手寫了個DFS版本, 應該不難理解, 還蠻暴力就是了
12/15 01:09, 86F

12/15 01:09, , 87F
原po加油XD
12/15 01:09, 87F

12/15 01:18, , 88F
恩恩謝謝樓上大大 借參考一下~
12/15 01:18, 88F

02/15 23:16, , 89F
朝聖推
02/15 23:16, 89F

03/05 17:45, , 90F
朝聖
03/05 17:45, 90F

03/15 22:28, , 91F
經典舊文朝聖
03/15 22:28, 91F

03/16 20:03, , 92F
for 奇觀
03/16 20:03, 92F

05/18 14:31, , 93F
2016朝聖
05/18 14:31, 93F
文章代碼(AID): #1B8eswoY (C_and_CPP)
文章代碼(AID): #1B8eswoY (C_and_CPP)