queen.cpp
上传用户:whjcdz88
上传日期:2011-09-07
资源大小:121k
文件大小:3k
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <math.h>
- const int SIZE=30;
- int count=0;
- int globalflag;
- int p[SIZE];
- bool check()
- {
- for(int m=1;m<SIZE;m++)
- for(int i=0;i<m;i++)
- if(p[i]==p[m]||(abs(p[i]-p[m])==abs(i-m)))
- {
- printf("<%d,%d>,<%d,%d>n",m,p[m],i,p[i]);
- return false;
- }
- return true;
- }
- void print()
- {
- printf("n");
- for(int i=0;i<SIZE;i++)
- {
- printf("t");
- for(int j=0;j<SIZE;j++)
- {
- if(j!=p[i])
- printf("0 ");
- else
- printf("1 ");
- }
- printf("n");
- }
- printf("n");
- }
- void Queen(int m)
- {
- if(m<SIZE-1&&globalflag==0)
- {
- if(m!=0)
- {
- for(int k=0,i=rand()%SIZE;k<SIZE;k++)
- {
- int flag=0;
- for(int j=0;j<m;j++)
- if(p[j]==i||abs(p[j]-i)==abs(m-j))
- {
- flag=1;
- break;
- }
- if(flag==0)
- {
- p[m]=i;
- Queen(m+1);
- }
- i=(i+1)%SIZE;
- }
- }
- else if(m==0)
- {
- for(int i=(int)rand()%SIZE,j=0;j<SIZE;j++)
- {
- p[m]=i;
- Queen(m+1);
- i=(i+1)%SIZE;
- }
- }
- }
- else if(m==(SIZE-1))
- {
- for(int i=0;i<SIZE;i++)
- {
- int flag=0;
- for(int j=0;j<m;j++)
- if(p[j]==i||abs(p[j]-i)==abs(m-j))
- {
- flag=1;
- break;
- }
- if(flag==0)
- {
- p[m]=i;
- print();
- if(check()==false)
- printf("simple_errorn");
- globalflag=1;
- }
- if(globalflag==1)
- break;
- }
- }
- }
- void even_grow(int m,int n,bool flag)
- {
- if(flag==0)
- {
- int x=rand()%SIZE,y=rand()%SIZE;
- for(int i=1;i<SIZE;i++)
- p[(i*m+x)%SIZE]=(y+n*i)%SIZE;
- }
- else
- {
- for(int i=1;i<SIZE+1;i++)
- p[(i*m+SIZE)%(SIZE+1)]=(n*i+SIZE)%(SIZE+1);
- }
- if(check()==false)
- printf("m_n_errorn");
- print();
- }
- bool hushu(int m,int n)
- {
- int flag=0;
- for(int i=2;i<=n&&i<=m;i++)
- {
- if(n%i==0)
- {
- if(m%i==0)
- flag=1;
- }
- }
- if(flag==0)
- return true;
- return false;
- }
- void m_n_grow(int &m,int &n,bool global)
- {
- m=0;n=0;
- int size=0,k=0,flag=0,current=2,next=2;
- if(global==0)
- size=SIZE;
- else
- size=SIZE+1;
- for(int i=2;i<size/2;i++)
- {
- for(int j=2;j<=sqrt(i);j++)
- if(i%j==0)
- break;
- if(j>sqrt(i)&&hushu(i,size))
- {
- next=current;
- current=i;
- if(current!=next&&hushu(abs(current-next),size))
- {
- n=current;
- m=next;
- printf("%d ,%dn",m,n);
- break;
- }
- }
- }
- }
- void main()
- {
- int m=0,n=0;
- srand(time(NULL));
- globalflag=0;
- for(int i=0;i<SIZE;i++)
- p[i]=0;
- if(SIZE%2==1)
- {
- m_n_grow(m,n,0);
- if(m!=0&&n!=0)
- {
- printf("even_grown");
- even_grow(m,n,0);
- printf("even_grown");
- }
- else
- {
- printf("simplen");
- Queen(0);
- printf("simplen");
- }
- }
- else if(SIZE%2==0)
- {
- m_n_grow(m,n,1);
- if(m!=0&&n!=0)
- {
- printf("odd_grown");
- even_grow(m,n,1);
- printf("odd_grown");
- }
- else
- {
- printf("simplen");
- Queen(0);
- printf("simplen");
- }
- }
- }
-