?? ehh.cpp
字號(hào):
#include <iostream>
#define stepMax 8
int m,n;
int i,j,count=0;
int iArray[20][20]={0};
void IFUN(int a,int b)
{//列沖突
for(i=a;i<stepMax;i++) iArray[i][b]+=1;
for(i=a;i>=0;i--) iArray[i][b]+=1;
//行沖突
for(j=b;j<stepMax;j++) iArray[a][j]+=1;
for(j=b;j>=0;j--) iArray[a][j]+=1;
//反對(duì)角線沖突
for(i=a,j=b;(i<stepMax)&&(j>=0);i++,j--) iArray[i][j]+=1;
for(i=a,j=b;(i>=0)&&(j<stepMax);i--,j++) iArray[i][j]+=1;
//對(duì)角線沖突
for(i=a,j=b;(i<stepMax)&&(j<stepMax);i++,j++) iArray[i][j]+=1;
for(i=a,j=b;(i>=0)&&(j>=0);i--,j--) iArray[i][j]+=1;
}
void DFUN(int a,int b)
{
//列沖突取消
for(i=a;i<stepMax;i++) iArray[i][b]-=1;
for(i=a;i>=0;i--) iArray[i][b]-=1;
//行沖突 取消
for(j=b;j<stepMax;j++) iArray[a][j]-=1;
for(j=b;j>=0;j--) iArray[a][j]-=1;
//反對(duì)角線沖突取消
for(i=a,j=b;(i<stepMax)&&(j>=0);i++,j--) iArray[i][j]-=1;
for(i=a,j=b;(i>=0)&&(j<stepMax);i--,j++) iArray[i][j]-=1;
//對(duì)角線沖突 取消
for(i=a,j=b;(i<stepMax)&&(j<stepMax);i++,j++) iArray[i][j]-=1;
for(i=a,j=b;(i>=0)&&(j>=0);i--,j--) iArray[i][j]-=1;
}
void printQueens()
{
for(i=0;i<stepMax;i++)
{for(j=0;j<stepMax;j++)
if(iArray[i][j]<20)
printf(" *");
else printf(" Q");
printf("\n");}
printf("\n");
}
int tryThisStep(int lev,int k)
{ if(iArray[lev][k]==0)//當(dāng)該位置為0的話
{ IFUN(lev,k); //在lev行,k列處放置皇后的沖突
iArray[lev][k]=999; //在lev行,k列處放置皇后
return 1;
}
return 0;
}
int canDoThisStep(int lev)
{
for(j=0;j<stepMax;j++)
{if(iArray[lev+1][j]==0) //如果下一步中有一個(gè)空格,說(shuō)明這個(gè)可以放
return 1;
}
return 0; //能執(zhí)行到這步,說(shuō)明下一步中沒(méi)有空格。
}
void OutStackDoSomeThing(int lev,int k)
{
DFUN(lev,k); //把原來(lái)放皇后后沖突的位還原
iArray[lev][k]=0; //把原來(lái)放皇后的位置還原
}
void TryPutQueens(int level) { //level是指放置皇后的計(jì)數(shù),如果這次需要放第3行了,
//那么此時(shí)level==3(注:我這里假設(shè)level范圍是1~8)
if (level == stepMax) {
//已經(jīng)放了8個(gè)皇后了,任務(wù)完成了,打印吧!
printQueens(); //<--這是輸出結(jié)果的過(guò)程。
count++; //共有幾種方法計(jì)數(shù).
return ;
}
else //如果沒(méi)有放到第8個(gè)的話,就繼續(xù)放,level <=8 都要執(zhí)行這個(gè)
for (int w=0; w<stepMax;w++) { //stepMax指的是試探方法(能夠嘗試放置的方法),比如本
//題中第level皇后總有8種放法——從第一列到第八列。
//因此,此時(shí)的stepMax=8
if(! tryThisStep(level,w)) continue; //<---嘗試第i種試探方法
if (canDoThisStep(level)) //<---- 就是說(shuō)不會(huì)造成皇后間的攻擊,可以放
TryPutQueens(level+1); //<---第N個(gè)皇后如果可以放置,就可以嘗試放第N+1個(gè)皇后
OutStackDoSomeThing(level,w); //比如你說(shuō)的拿掉一個(gè)Queens后,要把其他位置減1。
}
};
void main()
{
TryPutQueens(0); ////從第0行開(kāi)始放。
printf("%3d",count);
return; }
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -