回 帖 发 新 帖 刷新版面

主题:如何编程实现八皇后问题

八皇后问题:在一个8*8格的国际象棋盘上放上八个皇后,使其不能相互攻击,即任何两个皇后不能处于棋盘的同一行,同一列和同一斜线上。试编写一个函数实现八皇后问题。

回复列表 (共2个回复)

沙发


以前写的一个……
做做参考吧……
#include<stdio.h>
int a[8][8],k=0;
trace(int node)
{int t,m,n,flag,i,j;
 if(node==8)
  {k++;
  printf("NO.%d:\n",k);
   for(i=0;i<8;i++)
     {for(j=0;j<8;j++)
       {if(a[i][j]==1)
        printf("Q ");
        else printf(". ");
       }
       printf("\n");

     }

  }
 else
 for(j=0;j<8;j++)
   {a[node][j]=1;
    for(t=node-1,m=j-1,n=j+1,flag=0;t>=0;t--,m--,n++)
       {
        if(a[t][j]==1) flag=1;
        if(m>=0)
          {if(a[t][m]==1) flag=1;}
        if(n<=7)
          {if(a[t][n]==1) flag=1;}
       }
       if(flag)
       {a[node][j]=0;
        continue;
        }
       trace(node+1);
       a[node][j]=0;
   }
}
main()
{trace(0);
 printf("s=%d",k);
 getch();
}

板凳

我这里也有一个,看看吧,也是刚编不久的
//输入一个皇后的位置,就打印出有一个皇后在此位置的各种情况;如果输入0 0,就打印出全部的情况

#include "stdio.h" 
bool board[8][8]={0}; 
int num=0; //满足条件的个数 
int a,b; //输入一个皇后的初始位置 
void output() //输出 

    int i, j; 
    for(i=0;i<8;i++) 
    { 
        for(j=0;j<8;j++) 
        { 
            if(!board[i][j]) printf("%2d",0); 
            else printf("%2d",1); 
        } 
        printf("\n"); 
    } 
    num++; 
    printf("\n\n"); 
    


int  check(int x,int y) //判断是否能放 

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


void search(int x,int num) // 搜索函数  x表示行,num 表示皇后的个数

    int i; 
    if(num>=8) { output(); } 
    if(x==a-1) search(a,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; 
            } 
        } 
    } 
    


int main() 

    scanf("%d %d",&a,&b); 
    board[a-1][b-1] = 1 ; 
    search(0,0); 
    printf("%d\n",num); 
    return 0; 


我来回复

您尚未登录,请登录后再回复。点此登录或注册