皇后问题栈实现
2015-03-05 14:27
267 查看
#include<iostream.h>
#include<Windows.h>
#include<stdlib.h>
#define M 20
#define N 20
struct queen{
int x;
int y;
queen *next;
};
void push(int xx,int yy,queen *head){
static queen *p=head;
queen *new_node=(queen *)malloc(sizeof(queen));
new_node->x=xx;
new_node->y=yy;
p->next=new_node;
p=new_node;
p->next=NULL;
}
void pop(int &xx,int &yy,queen *head){
while(head->next->next!=NULL)
head=head->next;
queen *p=head->next;
head->next=NULL;
xx=p->x;
yy=p->y;
free(p);
}
void displaystack(queen *head)
{queen *p;
p=head;
while(head!=NULL)
{cout<<p->x<<endl;
head=head->next;}
}
void createqueen(int array
,int m,int n)
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
array[i][j]=1;
}
void printqueen(int array
,int m,int n){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(array[i][j]==1)cout<<"■";
if(array[i][j]==2)cout<<"♀";
if(array[i][j]==3)cout<<"※";
if(array[i][j]==4)cout<<"×";
}
cout<<endl;
}Sleep(200);cout<<endl;
}
void changequeen(int array
,int ii,int jj,int m,int n){
for(int k=0;k<m;k++)
array[k][jj]=4;
for( k=0;k<n;k++)
array[ii][k]=4;
int i=ii;
int j=jj;
while(i<m&&j<n)
array[++i][++j]=4;
i=ii;
j=jj;
while(i>=0&&j>=0)
array[--i][--j]=4;
i=ii;
j=jj;
while(i<m&&j>=0)
array[++i][--j]=4;
i=ii;
j=jj;
while(i>=0&&j<m)
array[--i][++j]=4;
array[ii][jj]=2;
}
void changequeens(queen *head,int array
,int m,int n,queen*head2)
{int i,j;
createqueen(array,m,n);
head2->next=NULL;
while(head->next!=NULL){
pop(i,j,head);
push(i,j,head2);
changequeen(array,i,j,m,n);
}
while(head2->next!=NULL)
{pop(i,j,head2);
push(i,j,head);
}
head2->next=NULL;
}
void movequeen(int m,int n,int a
,queen *head,queen *head2)
{
int j=0;
int next=0;
int nexts=0;
int nextss=1;
for(;j<n;)
{
int i=0;
int array
;
for(int x=0;x<M;x++)
for(int y=0;y<N;y++)
array[x][y]=a[x][y];
array[i][j]=2;
push(i,j,head);
changequeen(array,i,j,m,n);
//printqueen(array,m,n);
for(i=1;i<m;)
{
for(int k=0;k<n;k++)
{
nextss:nextss++;
if(array[i][k]==1)
{ push(i,k,head);changequeen(array,i,k,m,n);//printqueen(array,m,n);
if((i+1)==m)
{printqueen(array,m,n);head->next=NULL;goto nexts;}
goto next;
}
if((k+1)==n)
{
if(head->next==NULL)
goto nexts;
pop(i,k,head);
changequeens(head,array,m,n,head2);
array[i][k]=3;
printqueen(array,m,n);
goto nextss;
}
}
next:i++;
}
nexts:j++;
}
cout<<"完毕";
}
void main(){
queen *head=(queen *)malloc(sizeof(queen));
head->x=0;
head->y=0;
head->next=NULL;
queen *head2=(queen *)malloc(sizeof(queen));
head2->next=NULL;
int queens
;
int m,n;
cout<<"请输入行和列";
cin>>m>>n;
createqueen(queens,m,n);
//printqueen(queens,m,n);
movequeen(m,n,queens,head,head2);
return;
}
#include<Windows.h>
#include<stdlib.h>
#define M 20
#define N 20
struct queen{
int x;
int y;
queen *next;
};
void push(int xx,int yy,queen *head){
static queen *p=head;
queen *new_node=(queen *)malloc(sizeof(queen));
new_node->x=xx;
new_node->y=yy;
p->next=new_node;
p=new_node;
p->next=NULL;
}
void pop(int &xx,int &yy,queen *head){
while(head->next->next!=NULL)
head=head->next;
queen *p=head->next;
head->next=NULL;
xx=p->x;
yy=p->y;
free(p);
}
void displaystack(queen *head)
{queen *p;
p=head;
while(head!=NULL)
{cout<<p->x<<endl;
head=head->next;}
}
void createqueen(int array
,int m,int n)
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
array[i][j]=1;
}
void printqueen(int array
,int m,int n){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(array[i][j]==1)cout<<"■";
if(array[i][j]==2)cout<<"♀";
if(array[i][j]==3)cout<<"※";
if(array[i][j]==4)cout<<"×";
}
cout<<endl;
}Sleep(200);cout<<endl;
}
void changequeen(int array
,int ii,int jj,int m,int n){
for(int k=0;k<m;k++)
array[k][jj]=4;
for( k=0;k<n;k++)
array[ii][k]=4;
int i=ii;
int j=jj;
while(i<m&&j<n)
array[++i][++j]=4;
i=ii;
j=jj;
while(i>=0&&j>=0)
array[--i][--j]=4;
i=ii;
j=jj;
while(i<m&&j>=0)
array[++i][--j]=4;
i=ii;
j=jj;
while(i>=0&&j<m)
array[--i][++j]=4;
array[ii][jj]=2;
}
void changequeens(queen *head,int array
,int m,int n,queen*head2)
{int i,j;
createqueen(array,m,n);
head2->next=NULL;
while(head->next!=NULL){
pop(i,j,head);
push(i,j,head2);
changequeen(array,i,j,m,n);
}
while(head2->next!=NULL)
{pop(i,j,head2);
push(i,j,head);
}
head2->next=NULL;
}
void movequeen(int m,int n,int a
,queen *head,queen *head2)
{
int j=0;
int next=0;
int nexts=0;
int nextss=1;
for(;j<n;)
{
int i=0;
int array
;
for(int x=0;x<M;x++)
for(int y=0;y<N;y++)
array[x][y]=a[x][y];
array[i][j]=2;
push(i,j,head);
changequeen(array,i,j,m,n);
//printqueen(array,m,n);
for(i=1;i<m;)
{
for(int k=0;k<n;k++)
{
nextss:nextss++;
if(array[i][k]==1)
{ push(i,k,head);changequeen(array,i,k,m,n);//printqueen(array,m,n);
if((i+1)==m)
{printqueen(array,m,n);head->next=NULL;goto nexts;}
goto next;
}
if((k+1)==n)
{
if(head->next==NULL)
goto nexts;
pop(i,k,head);
changequeens(head,array,m,n,head2);
array[i][k]=3;
printqueen(array,m,n);
goto nextss;
}
}
next:i++;
}
nexts:j++;
}
cout<<"完毕";
}
void main(){
queen *head=(queen *)malloc(sizeof(queen));
head->x=0;
head->y=0;
head->next=NULL;
queen *head2=(queen *)malloc(sizeof(queen));
head2->next=NULL;
int queens
;
int m,n;
cout<<"请输入行和列";
cin>>m>>n;
createqueen(queens,m,n);
//printqueen(queens,m,n);
movequeen(m,n,queens,head,head2);
return;
}
相关文章推荐
- N皇后问题的实现
- C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)
- N皇后问题 - 使用随机爬山法实现其快速解法
- n皇后问题的非递归迭代算法(C++实现)
- N皇后问题java实现
- 皇后问题的Ruby实现
- 八皇后问题—递归实现
- 8皇后问题 OSGI版本实现
- n皇后问题java递归实现
- N 皇后问题C语言实现
- 通过8皇后问题浅析回溯法的递归实现
- 8皇后问题(java算法实现)
- 【转】用c++实现的8皇后问题
- sicp练习2.42 [解8皇后问题的Scheme语言实现]
- 非递归形式的N皇后问题---用C#实现,VS2008可以执行
- 用c++实现的8皇后问题
- C语言实现N皇后问题源代码
- 回溯法求解 “n 皇后 问题”——Java 实现
- 八(N)皇后问题的C++实现
- java实现回溯法解n皇后问题