作者pocernld (時間像流水般過去了...)
看板C_and_CPP
標題[問題] 請問一下我的八皇后程式
時間Sat Dec 12 02:21:42 2009
遇到的問題: (題意請描述清楚)
我寫了一個八皇后程式,但是編譯以後執行卻完全沒東西,
可否請板上各位高手幫我看一下,謝謝
希望得到的正確結果:
八皇后的解
程式跑出來的錯誤結果:
完全不會動...
開發平台:
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)
推 ducksteven:好...好多層 囧 12/12 02:45
→ yoco315:藝術品阿....... 12/12 03:32
推 powertodream:好恐怖的code....@@" 12/12 04:08
推 legendmtg:看不懂... 12/12 04:22
推 joefaq:嘖嘖 好多層... 12/12 05:33
推 abyss02wang:天。.天阿@@ 12/12 05:36
推 soniclin:世界奇觀! 12/12 05:45
推 LPH66:一看就知道是那種很壯觀的code (視覺上) 12/12 05:50
推 dexders:u win!! 12/12 05:55
推 joefaq:你可以去Google一下別人怎麼寫的 不要只看一份 12/12 06:15
→ devilarise:這是for迴圈疊疊樂嗎? @o@ 12/12 07:03
推 StubbornLin:靠~ 好屌~ XDDD 12/12 07:57
推 StubbornLin:這種程式如果能debug的話 那還真的超強的 XD 12/12 08:02
→ remmurds:也難怪原PO會debug兩天de不出來了... 12/12 08:40
推 tyc5116:我想....應該得不到答案吧...@@ 12/12 10:09
→ tyc5116:應該要先試著簡化才對....@@ 12/12 10:10
→ ianfang:這種恐怖的東西只有你自己有辦法debug吧... 12/12 10:48
→ ianfang:你應該花兩天時間熬夜寫新寫法比較快 真的... 12/12 10:49
推 netsphere:推 原PO的耐心跟毅力 12/12 10:50
→ netsphere:不過下次如果要寫 sudoku 那最好不要這樣寫 XD 12/12 10:53
推 hilorrk:糟了! 是世界奇觀! 12/12 10:53
推 YCK:@@ 那個形狀.... 12/12 10:55
推 johnlinvc:娘子....快跟牛魔王一起出來看世界奇觀 12/12 11:10
推 snowlike:1st執行的setblock就有問題,除很有自信應該要測試副函式 12/12 11:18
→ snowlike:哦對了不是不會動,是跑完了.. 12/12 11:21
推 tw00088437:還好不是我寫的 不然我的對齊方式看了一定會更崩潰xd 12/12 11:59
推 yoco315:小弟發自內心深處的建議:砍掉重練 qq 12/12 12:22
→ yoco315:對了 @@ 重練得時候記得先寫 2q 跟 4q 比較小的版本.. 12/12 12:31
推 deepking:壯觀 砍掉重練+1... 12/12 12:43
推 twotwoone:奇才啊 12/12 13:07
推 ktta:看到頭暈 XD 12/12 13:57
推 freesamael:真的是世界奇觀阿XD 12/12 14:04
推 dendrobium:我笑了XD 12/12 14:28
→ nowar100:我好想m起來 真的太酷了 XD 12/12 15:30
推 holymars:糟了!是世界奇觀! 12/12 16:18
→ sunneo:for for for for (霍霍霍... 12/12 17:37
→ sunneo:你要不要改用listener mode/Message driven來寫 12/12 17:38
→ pocernld:小弟才疏學淺 剛學不久 只會用一些簡單的指令 12/12 17:56
→ pocernld:還麻煩各位大大指教了 感激不盡... 12/12 17:56
→ final01:GJ 12/12 18:12
推 Domos:想必原po是天生的coding奇才,將來成功必定是指日可待 12/12 18:36
推 ducksteven:剛學就敢挑戰八皇后問題,的確很有勇氣! 12/12 18:47
→ bugmans:新手常常越級打怪,話說18043的那位新手怎麼沒無名的消息了 12/12 19:47
→ eva19452002:你的code已經可以納入教科書的新手coding style範例了 12/12 20:12
推 wa120:我還沒挑戰過這麼多for迴圈 12/12 20:48
推 avhacker:給原 PO: 你應該忘掉 8 這個數字,想想 N 皇后問題 12/12 22:18
推 newnovice:你code上癮了XD 12/12 22:27
推 softwind:厲害 世界奇觀... 小弟佩服 @@" 12/12 22:46
推 hrs113355:XDDDDDD 12/12 23:20
推 softwind:我光看 這要複製貼上改變數 我就覺得累了 還是給 "推" 12/12 23:25
推 jerry54010: XDDD 12/12 23:31
推 jimmyken793:XDDD 12/12 23:54
推 siriusu:我笑了 不過說真的 螞蟻書就是超早就給八皇后的題目 12/13 00:09
推 ADF:囧 12/13 00:26
推 legendmtg:竟然被轉in2了XDD 12/13 00:58
推 blackwindy:我記得我第一次寫這個沒超過30行的樣子...不過不是C... 12/13 01:52
推 YCK:螞蟻書的八皇后好像在陣列那一章? 還有騎士旅行 有趣的題目~ 12/13 08:11
推 StubbornLin:這就是所謂的結構化程式設計 請看那精美的金字塔結構 12/13 08:12
→ StubbornLin:(誤) 12/13 08:12
推 Tidus0000:那個for... XDDDDDDDDDDDDDDD 12/13 10:29
推 p221071889:那個for實在是太威了 12/13 10:53
→ kenzou:娘子,快和牛魔王出來看上帝! (煙 12/13 11:24
推 lwecloud:forforforfor~~forforforfor~~for家拳的套路招式靈活 12/13 11:25
推 conan77420:這應該要列入教課書的經典範例中XD 12/13 11:29
推 WalkingIce:炫耀文呀!! 12/13 12:35
推 coronach:真的 請你思考一下N皇后怎麼寫... 12/13 13:08
推 kewang:............16層的for loop 囧 12/13 13:15
推 GGPlay:經典,如果方法太長就有壞code的味道了,樓主可以把程式的 12/13 13:59
→ GGPlay:概念抽象化成函數,這樣可以簡化問題也比較好debug 12/13 13:59
推 frankvv:可以練習算最內圈的big-O XD 12/13 16:34
推 legnaleurc:糟了!是世界奇觀! 12/13 17:44
推 andyjy12:看了一直笑XDDD 12/13 18:42
推 walker2009:我也笑了XDDD 12/13 23:37
推 dsin:看到for for我就PAGE DOWN去看推文了 XD 12/14 00:52
推 luccifero:朝聖推 12/14 00:59
推 a83294:當初寫到這個也有想過這樣寫....只不過一想到寫這麼迴圈 12/14 06:23
→ a83294:就直接放棄找新解法了.....原PO真的很有心 12/14 06:23