主题:八王后图形输出
yaozheng
[专家分:28410] 发布于 2002-11-11 17:48:00
#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个回复)
沙发
Ghost-mjw [专家分:130] 发布于 2002-11-16 18:35:00
书写好乱,不想看了!
板凳
yuan [专家分:0] 发布于 2002-11-28 21:38:00
不想看,好繁啊
看我写的
#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 楼
lullaby [专家分:70] 发布于 2005-09-21 01:22:00
我也来凑个热闹
#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 楼
yuucyf [专家分:1080] 发布于 2005-10-21 13:00:00
#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 楼
雨523 [专家分:200] 发布于 2006-06-21 09:18:00
Ft,好几个都得调
6 楼
lauo [专家分:0] 发布于 2007-06-11 23:01:00
看我的:
这是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 楼
langzhao [专家分:120] 发布于 2007-06-20 22:28:00
刚刚学C不久好多看不明白
应该注意书写
我来回复