回 帖 发 新 帖 刷新版面

主题:八王后图形输出

#define Number 8  
#include <stdio.h>  
#include <math.h>  
#include <graphics.h>  
#include <conio.h>  
void main(void)  
{  
signed int Count=0,DismatchFlag=0,Current=0,Temp=0,_Current=0,MoveFlag=0;  
int gd,gm;  
int Queen[Number]={0,0,0,0,0,0,0,0};  
gd=DETECT;  
initgraph(&gd,&gm,"");  
setcolor(BLUE);  
Queen[0]=0;  
do{  
if(!MoveFlag) /*设置下一个王后。若此时是找到一种布局后的调整则不放下一个王后*/  
{  
Queen[++Current]=0;  
}  
MoveFlag=0; /*清除调整布局不放王后的标志*/  
do{  
for(Temp=Current-1;Temp>=0;Temp--) /*同已摆下王后的冲突判断*/  
{  
if(Queen[Current]==Queen[Temp]||(Current-Temp==abs(Queen[Current]-Queen[Temp]))||Queen[Current]>Number-1) /*冲突条件*/  
{  
DismatchFlag=1; /*冲突标志*/  
break;  
}  
}  
if(DismatchFlag) /*冲突调整*/  
{  
if(Queen[Current]>=Number-1) /*当前王后已到最后一列则清除该王后,上一个王后摆到下一列*/  
{  
Queen[Current--]=0;  
Queen[Current]++;  
DismatchFlag=0;  
}  
else /*没到最后一列则该王后摆到下一列*/  
{  
Queen[Current]++;  
DismatchFlag=0;  
}  
}  
else /*没冲突则结束该循环*/  
break;  
}while(1);  
if(Current==Number-1) /*这是一种布局吗?*/  
{  
printf("now program found a setting.\n"); /*get a result;*/  
Count++;  

for(j=0;j<8;j++)for(i=0;i<9;i++){rectangle(20+i*40,20,60,60+j*40);}; /*打印棋枰*/
floodfill(25+Queen[0]*40,25,RED);
printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d",Queen[0],Queen[1],Queen[2],Queen[3],Queen[4],Queen[5],Queen[6],Queen[7]);
getchar();
if(Queen[Current]==Number-1) /*是一种布局则调整当前王后*/
{
Queen[--Current]++;
MoveFlag=1;
}
else
{
Queen[Current]++;
MoveFlag=1;
};
}
}while(!(Queen[0]==Number)); /*历遍了所有布局吗?*/
printf("now the Setting have %d type",Count);
closegraph();
}  

回复列表 (共7个回复)

沙发

书写好乱,不想看了!

板凳

不想看,好繁啊
看我写的
#include"iostream.h"
#define n 8
int abs(int r){
if (r>0)return r;
else return (-r);
}

void print(int x[n]){
cout<<"result array:"<<endl;
cout<<"(";
for(int k=1;k<=n;k++)cout<<x[k]<<" ";
    cout<<")";
}

bool place(int k,int x[n])
{//测试第k行应放在何处,设前面k-1行已经放好
   int i=1;//i指示第几行
     while(i<k)
{ if(x[i]==x[k]||abs(i-k)==abs(x[i]-x[k]))return false;//在同一列上或同一对角线上
       i++;}//若第i行无冲突,继续检查下一行与k行是否冲突}
   return true;
}

void queen(int x[n]){
int k=1;
x[1]=0;
while(k>0){
x[k]=x[k]+1;
while(x[k]<=n&&!place(k,x))x[k]=x[k]+1;//看下一列
if(x[k]<=n){//可放
if(x[k]=n)print(x);
else k=k+1;//下一行准备
}//if
else k=k-1;//回溯
}//while
}

void main()
{
int x[n+1];
          queen(x);
print(x);
}
很简单:-P;
可是有错误,不知道错在哪里了(
谢谢!!

3 楼

我也来凑个热闹

#include <stdio.h>
#include <stdlib.h>

int a[8][8] = { 0 , 0 , 0 , 0 ,/*  */ 0 , 0 , 0 , 0 ,/*  */ 0 , 0 , 0 , 0 ,/*  */ 0 , 0 , 0 , 0 ,0 , 0 , 0 , 0 ,/*  */ 0 , 0 , 0 , 0 ,/*  */ 0 , 0 , 0 , 0 ,/*  */ 0 , 0 , 0 , 0 } ;

int count = 0 ;


void PrintArray ()
{
    for ( int i = 0 ; i < 8 ; i ++ )
    {
        for ( int j = 0 ; j < 8 ; j ++ )
            printf ("%d  " , a[i][j] ) ;
        printf ("\n") ;
    }
    printf ("\n\n") ;
}


int CheckCol ( int i , int j )
{
    for ( int tmp = 0 ; tmp < i ; tmp ++ )
    {
        if ( a[tmp][j] == 1 )
            return 0 ;
    }
    return 1 ;
}

int CheckXieL ( int i , int j )
{
    int row = i - 1 ;
    int col = j - 1 ;
    while ( row >= 0 && col >= 0 )
    {
        if ( a[row][col] == 1 )
            return 0 ;
        row -- ;
        col -- ;
    }
    return 1 ;
}

int CheckXieR ( int i , int j )
{
    int row = i - 1 ;
    int col = j + 1 ;
    while ( row >= 0 && col <= 7 )
    {
        if ( a[row][col] == 1 )
            return 0 ;
        row -- ;
        col ++ ;
    }
    return 1 ;
}

int CheckXie ( int i , int j )
{
    if ( CheckXieR ( i , j ) && CheckXieL ( i , j ) )
        return 1 ;
    return 0 ;
}


int IsOk ( int i , int j )
{
    if ( CheckCol ( i , j ) && CheckXie ( i , j ) )
        return 1 ;
    else
        return 0 ;
}

void Trial ( int i )
{
    int res ;
    if ( i > 7 )
    {
        count ++ ;
        PrintArray () ;
    }
    else
    {
        for ( int j = 0 ; j < 8 ; j ++ )
        {
            a[i][j] = 1 ;
            if ( ( res = IsOk ( i , j ))  )
                Trial ( i + 1 ) ;  
            a[i][j] = 0 ;
        }
    }
}

void main ()
{
    Trial ( 0 ) ;
    printf ("\n\ncount = %d\n" , count ) ;
}

4 楼

#include<iostream>
#include<stdlib.h>
using namespace std ;

int data[8][8], j ;

void seek_back(int i);
void seek(int i, int j);

void seek_back(int i)
{
    for( j=0; j<8; j++)
       {
             if(data[i][j] == 1)
             break;
       }
    if(j<8-1)
       {
             data[i][j] = 0;
             seek(i,j+1);
       }
    else if(j == 8-1 && i>0)
       {
             data[i][j] = 0;
             seek_back(i - 1);
       }
}

void seek(int i, int l)
{

int flag1,flag2,flag3 , j ;

for( j=l;j<8;j++)
  {

    flag1 = flag2 = flag3 = 1;

    for(int k=0;k<i;k++)
        {
           if(data[k][j] == 1){flag1 = 0; break;} //不能同列
        }
    for(int n=1;i-n>=0 && j-n>=0;n++)
       {
     if(data[i-n][j-n] == 1){flag2 = 0; break;} //不能同斜行
        }
    for(int m=1;i-m>=0 && j+m <8;m++)
        {
     if(data[i-m][j+m] == 1){flag3 = 0; break;} //不能同反斜行
        }
    if(flag1 && flag2 && flag3)
        {
            data[i][j] = 1;
            break;
        }
  }
if(j < 8)
   {
     if(i<8-1)
        seek(i+1,0);
   }
else if(i>0)
   {
        seek_back(i - 1);
   }
}

int main()
{
    seek(0,0);
    for(int i=0;i<8;i++)
          {
                for(int j=0;j<8;j++)
                    { cout<<(int)data[i][j]<<" "; }
                        cout<<endl;
          }
    system("pause") ;
}

5 楼

Ft,好几个都得调

6 楼

看我的:
这是92种的方法:
#include"stdio.h"   
int i,j,r=0,k,b[8];
bool check(int i,int j){     /*检验是否合乎规则*/
    if(i==0)
        return true;
    else{
        for(k=i-1;k>=0;k--) 
            if(j==b[k]||j==b[k]-(i-k)||j==b[k]+(i-k))
                return false;
        return true;}
}
void out(void){           /*一个输出函数*/
     printf("The no.%d answer is:\n",r);
     for(i=0;i<8;i++)
         printf("%2d",b[i]);
     printf("\n");
}
void queen(int i,int j){         /*产生皇后的函数---试探法+递归*/
    for(int h=j;h<8;h++){
        if(check(i,h)==1){
            b[i]=h;
            if(i<7)
                queen(i+1,j);
            else{
                r+=1;
                out();}
        }
    }
}
void main(){         /*主函数*/
    queen(0,0);
}
方法2:(24种的,不知道12种如何得到,高手回复哦!)
#include"stdio.h"
int i,j,r=0,k,u,v,a[8],b[100][8];
bool check1(int i,int j){  /*对是否符合基本规则的检验*/
    if(i==0)
        return true;
    else{
        for(k=i-1;k>=0;k--) 
            if(j==a[k]||j==a[k]-(i-k)||j==a[k]+(i-k))
                return false;
        return true;}
}
bool check2(int i){            /*检验是否左右对称*/
    if(i==0)
        return true;
    else{
    for(j=i-1;j>=0;j--){
        int n=0;
        for(v=0;v<8;v++)
            if(b[j][v]==7-b[i][v])
              n++;
        if(n==8)
             return false;
    }
    return true;}
}
bool check3(int i){            /*检验是否上下对称*/
    if(i==0)
        return true;
    else{
    for(j=i-1;j>=0;j--){
        int n=0;
        for(v=0;v<8;v++)
            if(b[j][v]==b[i][7-v])
              n++;
        if(n==8)
             return false;
    }
    return true;}
}
bool check4(int i){        /*检验是否180度对称*/
    if(i==0) 
        return true;
    else{
        for(j=i-1;j>=0;j--){
          int n=0;
          for(v=0;v<8;v++){
             if(b[j][v]==7-b[i][7-v])
                n++;
          if(n==8)
               return false;}
    }
        return true;}
}
bool check(int i){              /*综合上述检验*/
    if(check2(i)==1&&check3(i)==1&&check4(i)==1)
        return true;
    return false;
}
void out(void){               /*输出函数*/
     printf("The no.%d answer is:\n",r);
     for(i=0;i<8;i++)
         printf("%2d",b[r][i]);
     printf("\n");
}
void queen(int i,int j){   /*自编的试探法+递归主函数*/
    for(int h=j;h<8;h++){
        if(check1(i,h)){
            a[i]=h;
            if(i<7)
                queen(i+1,j);
            else{
                for(u=0;u<8;u++)
                    b[r][u]=a[u];
                if(check(r)){
                    out();
                    r++;}
                else
                    r=r;}
        }
    }
}
void main(){        /*主函数倒挺简单的,呵呵*/
    queen(0,0);
}

7 楼

刚刚学C不久好多看不明白
应该注意书写

我来回复

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