當前位置:首頁 » 課程大全 » 八皇後問題c語言課程設計報告

八皇後問題c語言課程設計報告

發布時間: 2021-02-28 14:55:00

A. 八皇後問題課程設計的心得體會

/*八皇後:皇後可以在橫、豎、斜線上不限步數地吃掉其他棋子。
如何將8個皇後放在棋盤上(有8*8個方格),使它們誰也不能被吃掉!這就是著名的八皇後問題。
這個程序我看不懂.哪位朋友能我注釋一下.謝謝!
*/
#include <stdio.h>
int count;
#define N 8

int queen [10], column[20],left[20],right[20];

/*
函數功能:列印出八皇後的結果
*/
void prt1()

{ int j;

printf("No.%d ",++count);

for (j=1;j<=N;j++) printf("%3d",queen[j]);

printf("\n");

}
/*
函數功能:篩選出符合條件的八皇後的位置
函數入口:第幾行
*/

void search(int i)
{ int j;
for (j=1;j<=N;j++)
/*如果第i行所對應的列上為1且沿y=x方向線上的為1且沿y=-x方向線上的值為1,
則說明這個[i][j]這個坐標是合適的,可以放皇後*/
if (column[j]&&left[i-j+N]&& right[i+j])

{ queen[i]=j;/*放上皇後後,對應的列置0,表示這列的位置不能再放皇後*/
column[j]=0;
/*同理,沿y=x方向線和沿y=-x方向線都不能再放皇後*/
left[i-j+N]=0; right[i+j]=0;

/*如果還沒執行到第八行,遞歸繼續執行*/
if (i<N) search(i+1);

/*如果已經執行到第八行,則可以列印出八皇後的位置結果*/
else prt1();

/*還原初始狀態,以便使for(j=1;j<=8;j++)這個循環繼續有效執行*/
column[j]=1;
left[i-j+N]=1;
right[i+j]=1;
}
}

int main()

{ int i;

for (i=1;i<=2*N;i++)
/*設置初始狀態*/
column[i]=left[i]=right[i]=1;

count=0;
/*記數置0,進入函數計算*/
search(1);
return 0;

}

B. 八皇後問題求解的C語言程序的實現

這是個前不久,我為別人寫的一個代碼;
八皇後問題共有92種解;
以下代碼是解決:對於固定一個皇後位置,輸出所有可能情況.
如果這不適合你的答案你可以,稍微改改的哦~~

代碼如下:

#include "stdio.h"
bool board[8][8]={0};
int num=0; //滿足條件的個數
int inix,iniy; //輸入一個皇後的初始位置
void output() //輸出
{
int i, j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(!board[i][j]) printf("■ ");
else printf("◆ ");
}
printf("\n");
}
num++;
printf("\n\n");
return ;
}

bool check(int x,int y) //判斷是否能放
{
int i, j ;
for(i=0; i<8 ; i++)
{

if(board[i][y]==1) return false;
}

for(i=0;i<8;i++)
{
if(board[x][i]==1) return false;
}

i=x; j=y;

while(i>0 && j>0 ) { i--; j--; }
for(;i<8 && j<8 ; i++,j++)
if(board[i][j]==1) return false;

i=x; j=y;
while(i>0 && j<7 ) {i--;j++;}
for(;i<8 && j>=0 ; i++ ,j--)
if(board[i][j]==1) return false ;
return true ;
}

void search(int x,int num) // 搜索函數
{
int i;
if(num>=8) { output(); return ;}
if(x==inix-1) search(inix,num+1);
else
{
for(i=0;i<8;i++)
{
if(check(x,i))
{
board[x][i]=1;
search(x+1,num+1);
board[x][i]=0;
}
}
}
return ;
}

int main()
{
scanf("%d %d",&inix,&iniy);
board[inix-1][iniy-1] = 1 ;
search(0,0);
printf("%d\n",num);
return 0;
}

例如:
輸入 : 1 1
輸出 :
◆ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ◆ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ◆
■ ■ ■ ■ ■ ◆ ■ ■
■ ■ ◆ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ◆ ■
■ ◆ ■ ■ ■ ■ ■ ■
■ ■ ■ ◆ ■ ■ ■ ■

◆ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ◆ ■ ■
■ ■ ■ ■ ■ ■ ■ ◆
■ ■ ◆ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ◆ ■
■ ■ ■ ◆ ■ ■ ■ ■
■ ◆ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ◆ ■ ■ ■

◆ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ◆ ■
■ ■ ■ ◆ ■ ■ ■ ■
■ ■ ■ ■ ■ ◆ ■ ■
■ ■ ■ ■ ■ ■ ■ ◆
■ ◆ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ◆ ■ ■ ■
■ ■ ◆ ■ ■ ■ ■ ■

◆ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ◆ ■
■ ■ ■ ■ ◆ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ◆
■ ◆ ■ ■ ■ ■ ■ ■
■ ■ ■ ◆ ■ ■ ■ ■
■ ■ ■ ■ ■ ◆ ■ ■
■ ■ ◆ ■ ■ ■ ■ ■

4

C. 求C語言課程設計報告 程序已經寫好了 就是報告不知道怎麼寫 T-T

課程設計說明書規范要求
說明書是體現和總結課程設計成果的載體,一般不應少於3000字。
1、說明書基本格式
說明書手寫或列印均可。手寫要用統一的課程設計用紙,用黑或藍黑墨水書寫工整;列印時統一使用word文檔,正文採用小4號宋體,A4開紙,頁邊距均為20mm,行間距採用18磅,裝訂線留5mm。
正文各級標題編號的示例如下圖所示。

一級標題:小三號,宋體加粗,居左,18磅行距,段後0.5行,段前為0。
二級標題:四號,黑體,居左,18磅行距,段後為0.5,段前0行。
三級標題:小四號,黑體,居左,18磅行距,段後為0.5,段前0行。
正文內容起首空兩格。
2、說明書結構及要求
(1)封面,包括題目、系(部)、班級、學生姓名、學號、指導教師及時間(年、月、日)等項。
(2)摘要(僅對論文),摘要是論文內容的簡短陳述。關鍵詞應為反映論文主題內內容的通用技術詞彙,一般為3--4個左右,一定要在摘要中出現。
(3)目錄,要求層次清晰,給出標題及頁次。其最後一項是無序號的「參考文獻」。
(4)正文,正文應按照目錄所定的順序依次撰寫,要求計算準確,論述清楚、簡練、通順,插圖清晰,書寫整潔。文中圖、表及公式應規范地繪制和書寫。
(5)參考文獻,參考文獻必須是學生在課程設計中真正閱讀過和運用過的,文獻按照在正文中的出現順序排列。要求參考《畢業設計工作規程》。
(6)課程設計資料的裝訂,課程設計按以下順序裝訂成冊:封面、課程設計任務書、成績評定表、目錄、摘要、正文、設計體會及今後的改進意見、參考文獻、圖紙。

D. 用C語言編寫八皇後問題

#include "stdio.h"
#include "windows.h"
#define N 8 /* 定義棋盤大小 */
int place(int k); /* 確定某一位置皇後放置與否,放置則返回1,反之返回0 */
void backtrack(int i);/* 主遞歸函數,搜索解空間中第i層子樹 */
void chessboard(); /* 每找到一個解,列印當前棋盤狀態 */
static int sum, /* 當前已找到解的個數 */
x[N]; /* 記錄皇後的位置,x[i]表示皇後i放在棋盤的第i行的第x[i]列 */
int main(void)
{
backtrack(0);
system("pause");
return 0;
}
int place(int k)
{
/* 測試皇後k在第k行第x[k]列時是否與前面已放置好的皇後相攻擊。 x[j] == */
/* x[k] 時,兩皇後在同一列上;abs(k - j) == abs(x[j] - x[k]) 時,兩皇 */
/* 後在同一斜線上。兩種情況兩皇後都可相互攻擊,故返回0表示不符合條件。*/
for (int j = 0; j < k; j ++)
if (abs(k - j) == abs(x[j] - x[k]) || (x[j] == x[k])) return 0;
return 1;
}
void backtrack(int t)
{
/* t == N 時,演算法搜索至葉結點,得到一個新的N皇後互不攻擊的放置方案 */
if (t == N) chessboard();
else
for (int i = 0; i < N; i ++) {
x[t] = i;
if (place(t)) backtrack(t + 1);
}
}
void chessboard()
{
printf("第%d種解法:\n", ++ sum);
for (int i = 0; i < N; i ++) {
for (int j = 0; j < N; j ++)
if (j == x[i]) printf("@ ");
else printf("* ");
printf("\n");
}
printf("\n");
}

E. 八皇後C語言程序及實驗報告

這個有點難度
不好意思

F. 八皇後問題的數據結構課程設計報告

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
char n[3]={\'0\',\'0\'};/*用於記錄第幾組解*/
int a[8],b[15],c[24],i;
int h[8]={127,177,227,277,327,377,427,477};/*每個皇後的行坐標*/
int l[8]={252,217,182,147,112,77,42,7};/*每個皇後的列坐標*/
void *arrow;
void try(int i)
{int j;
for (j=1;j<=8;j++)
if (a[j-1]+b[i+j-2]+c[i-j+7]==3) /*如果第i列第j行為空*/
{a[j-1]=0;b[i+j-2]=0;c[i-j+7]=0;/*佔用第i列第j行*/
putimage(h[i-1],l[j-1],arrow,COPY_PUT);/*顯示皇後圖形*/
delay(500);/*延時*/
if(i<8) try(i+1);
else /*輸出一組解*/
{n[1]++;if (n[1]>\'9\') {n[0]++;n[1]=\'0\';}
bar(260,300,390,340);/*顯示第n組解*/
outtextxy(275,300,n);
delay(3000);
getch();
}
a[j-1]=1;b[i+j-2]=1;c[i-j+7]=1;
putimage(h[i-1],l[j-1],arrow,XOR_PUT);/*消去皇後,繼續尋找下一組解*/
delay(500);
}
}
int main(void)
{int gdrive=DETECT,gmode,errorcode;
unsigned int size;
initgraph(&gdrive,&gmode,"c:\\\\tc\\\\bgi");
errorcode=graphresult();
if (errorcode!=grOk)
{printf("Graphics error\\n");exit(1);}
rectangle(50,5,100,40);
rectangle(60,25,90,33);
/*畫皇冠*/
line(60,28,90,28);line(60,25,55,15);
line(55,15,68,25);line(68,25,68,10);
line(68,10,75,25);line(75,25,82,10);
line(82,10,82,25);line(82,25,95,15);
line(95,15,90,25);
size=imagesize(52,7,98,38); arrow=malloc(size);
getimage(52,7,98,38,arrow);/*把皇冠保存到緩沖區*/
clearviewport();
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 4);
setusercharsize(3, 1, 1, 1);
setfillstyle(1,4);
for (i=0;i<=7;i++) a[i]=1;
for (i=0;i<=14;i++) b[i]=1;
for (i=0;i<=23;i++) c[i]=1;
for (i=0;i<=8;i++) line(125,i*35+5,525,i*35+5);/*畫棋盤*/
for (i=0;i<=8;i++) line(125+i*50,5,125+i*50,285);
try(1);/*調用遞歸函數*/
delay(3000);

closegraph();
free(arrow);
}

G. 八皇後問題c語言程序中斜對角線為何用2N+1數組。有什麼含義程序如下

因為有正反都各有15條斜線啦,畫出來,數一下就知道了,N=8的話,共定義了17條,多兩條沒關系的

H. 數據夠課程(c語言)設計:八皇後問題,必須得用數據結構演算法,誰能幫一下忙啊

// Compiler: GNU GCC
#include <stdio.h>
#include <memory.h>

int main()
{
// def
int a[8],b[15],c[15];
int s[9],sum;
int t,f,i;

// init
f=true;
sum=0;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
// DFS
t=0;
s[0]=-1;
while(f)
{
s[t]++;
if (t==8)
{
// Output
printf("Case %3d: ",++sum);
for (i=0;i<8;i++)
printf("%2d",s[i]);
printf("\n");
// Stack Pop
t--;
a[s[t]]=0;
b[t+s[t]]=0;
c[t-s[t]+7]=0;
}
else if (s[t]==8)
{

if (t==0)
{
// Stack Empty
f=false;
}
else
{
// Stack Pop
t--;
a[s[t]]=0;
b[t+s[t]]=0;
c[t-s[t]+7]=0;
}
}
else if (![s[t]] && !b[t+s[t]] && !c[t-s[t]+7])
{
// Stack Push
a[s[t]]=1;
b[t+s[t]]=1;
c[t-s[t]+7]=1;
t++;
s[t]=-1;
}
}
printf("\n Total Case(s): %d\n",sum);
return 0;
}

I. 利用《數據結構》課程知識完成C語言程序設計「N皇後問題」(堆棧,一維數組,普通演算法都可以,用C語言寫

#include<stdio.h>//N皇後問題

#include<
stdlib.h
>

#include<stdio.h>


#include<
iostream.h
>


#include<
time.h
>

#include<dos.h>

#include<malloc.h>

typedefstruct{

int*elem;

intlength;

intlistsize;

}Sqlist;

intInitList(Sqlist&L){//初始化

L.elem=(int*)malloc(100*sizeof(int));

if(!L.elem)

return0;

L.length=0;

L.listsize=100;

return1;

}


intInsert(Sqlist&L,inte){//插入

intm=0,i=0;

int*p=&L.elem[0],*j=&L.elem[0];

if(L.length==0)

{*p=e;L.length++;return1;}

for(i;i<L.length;i++)

if(e>=*(p+i))

m=i+1;

for(i=L.length;i>m;i--)

*(j+i)=*(j+i-1);

L.elem[m]=e;

L.length++;

return1;

}


voidPrint(Sqlist&L,intn){//
遍歷
列印輸出

intk=1,i=0;int*p=&L.elem[0];

for(i=0;i<n*n;i++,k++){

printf("%d",*(p+i));

if(k==n){k=0;printf(" ");}}

printf(" ");

}


intReturnK(Sqlist&L,intk){//返回第K個元素的值

int*p=&L.elem[0];

return*(p+k-1);

}


voidFuK(Sqlist&L,intk,inte){//將第k個元素賦值為e

int*p=&L.elem[0];

*(p+k-1)=e;

}


intTiaoJian(SqlistL,intn,int&e){//是否滿足皇後問題判斷

intb[100];

intm=0,h=2*n;

for(intk=0;k<2*n;k++)b[k]=0;

for(inti=1;i<=n*n;i++)

if(ReturnK(L,i)==1)

{b[m]=(i-1)/n+1;m++;b[m]=i-(b[m-1]-1)*n;m++;}

for(intc=0;c<2*n;c++)

if(b[c]==0){h=c;break;}

for(c=0;c<h-2;c=c+2)

for(intd=c+2;d<h;d=d+2)

if(b[c]==b[d]||b[c+1]==b[d+1]||b[d+1]-b[c+1]==b[d]-b[c]||b[d+1]-b[c+1]==b[c]-b[d])

return0;

if(h==2*n){

printf(" %d皇後問題第%d個排列! ",n,e);e++;

}

return1;

}

voidTrial(Sqlist&L,inti,intn,int&e){//皇後問題

intj;

if(i>n){Print(L,n);}

elsefor(j=1;j<=n;j++){

FuK(L,n*i-n+j,1);

if(TiaoJian(L,n,e)==1)

Trial(L,i+1,n,e);

FuK(L,n*i-n+j,0);

}

}

voidmain(){

intk,i=0;

printf(" 請輸入要n皇後問題個數: ");

scanf("%d",&k);

time_trawtime;

structtm
*timeinfo;

time(&rawtime);

timeinfo=localtime(&rawtime);


SqlistL1;

InitList(L1);

for(i=0;i<k*k;i++)

Insert(L1,0);

inte=1;

Trial(L1,1,k,e);

printf("Thecurrentdate/timeis:%s",asctime(timeinfo));

time(&rawtime);

timeinfo=localtime(&rawtime);

printf("Thecurrentdate/timeis:%s",asctime(timeinfo));


printf("哈哈哈哈(^o^)/~ ");

system("pause");


}

J. 用c語言解決八皇後問題,要求第一個皇後位置用鍵盤輸入,需要詳細代碼和解釋,謝謝、

#include "stdio.h"
#include "math.h"
int row[8];
void arrange(int k)
{
int i,j;
if(k>8){
for(i = 1;i<=8;i++)
printf("%2d\n",row[i]);//k>8時應該輸出各列皇後的行號
return ;
}

for(j = 1;j <=8;j++) //試探第k列的每一個行號
{
for(i = 1;i <k ;i++)
if(row [i] == j ||專 (k-i) == abs(row[i] - j))
break;
if(i>=k) //成立說明第k列的第j行可用,則放置一屬個皇後
{
row [k] = j;
arrange(k+1); //安排第k+1列至第八列皇後
}
}
}
void main()
{
arrange(1);
}
這是全部八皇後的可能性的代碼,其中主要演算法以及有了,相信你可以自己改出來的,否則直接給你的話就沒有意義了。。。

聲明,這段代碼摘自西南交大《c程序設計教程》。。。

熱點內容
武漢大學學生會輔導員寄語 發布:2021-03-16 21:44:16 瀏覽:612
七年級學生作文輔導學案 發布:2021-03-16 21:42:09 瀏覽:1
不屑弟高考成績 發布:2021-03-16 21:40:59 瀏覽:754
大學畢業證會有成績單 發布:2021-03-16 21:40:07 瀏覽:756
2017信陽學院輔導員招聘名單 發布:2021-03-16 21:40:02 瀏覽:800
查詢重慶2018中考成績查詢 發布:2021-03-16 21:39:58 瀏覽:21
結業考試成績怎麼查詢 發布:2021-03-16 21:28:40 瀏覽:679
14中醫醫師資格筆試考試成績查分 發布:2021-03-16 21:28:39 瀏覽:655
名著賞析課程標准 發布:2021-03-16 21:27:57 瀏覽:881
北京大學商業領袖高端培訓課程 發布:2021-03-16 21:27:41 瀏覽:919