OPENJUDGE 1159:Maze
- 题目
描述
- 实现代码(没有AC,因为输出顺序不一样)
#include<iostream>
#include<cstring>
using namespace std;
void queen(int ,int count);
int k=1;
/*ol数组用于判断列,leftcheck用来判断左斜线,rightcheck用来判断右斜线。数组开成16是有原因的。
同一左斜行,i-j+8的值一样,同一右斜行,j+i的值相同。(j是行,i是列)
*/
bool col[8],leftcheck[16],rightcheck[16];
int chess[8][8];
int main()
{ memset(col,0,sizeof(col));
memset(rightcheck,0,sizeof(rightcheck));
memset(leftcheck,0,sizeof(leftcheck));
memset(chess,0,sizeof(chess));
queen(0,0);
return 0;
}
void queen( int m,int count)//count记录已放置的皇后数 ,m是行数
{ if(count==8)
{ cout<<"NO. "<<k<<endl;
k++;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
cout<<chess[i][j];
if(j==7)
cout<<endl;
else
cout<<' ';
}
}
//int step;
//cin>>step;
return ;
}
for(int j=0;j<8;j++)//遍历第m行
{
if(!col[j]&&!leftcheck[j-m+8]&&!rightcheck[m+j])//判断是否会被攻击
{
col[j]=true;
leftcheck[j-m+8]=true;
rightcheck[m+j]=true;
chess[m][j]=1;
count++;
// cout<<"放置在"<<m<<"行"<<j<<"列"<<"cout是"<<count<<endl;
queen(m+1,count);// 这里绝对不要用m++这种处理方法
//回溯
count--;
col[j]=false;
leftcheck[j-m+8]=false;
rightcheck[m+j]=false;
chess[m][j]=0;
}
}
}
- 显示搜索过程代码
#include<iostream>
#include<cstring>
using namespace std;
void queen(int ,int count);
int k=1;
bool col[8],leftcheck[16],rightcheck[16];//leftcheck teshu
int chess[8][8];
int main()
{ memset(col,0,sizeof(col));
memset(rightcheck,0,sizeof(rightcheck));
memset(leftcheck,0,sizeof(leftcheck));
memset(chess,0,sizeof(chess));
queen(0,0);
return 0;
}
void queen( int m,int count)//count记录已放置的皇后数 ,m是行数
{ if(count==8)
{ cout<<"NO. "<<k<<endl;
k++;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
cout<<chess[i][j];
if(j==7)
cout<<endl;
else
cout<<' ';
}
}
//int step;
//cin>>step;
return ;
}
for(int j=0;j<8;j++)//遍历第m行
{
if(!col[j]&&!leftcheck[j-m+8]&&!rightcheck[m+j])//判断是否会被攻击
{
col[j]=true;
leftcheck[j-m+8]=true;
rightcheck[m+j]=true;
chess[m][j]=1;
count++;
cout<<"放置在"<<m<<"行"<<j<<"列"<<"cout是"<<count<<endl;
queen(m+1,count);// 这里绝对不要用m++这种处理方法
//回溯
count--;
col[j]=false;
leftcheck[j-m+8]=false;
rightcheck[m+j]=false;
chess[m][j]=0;
}
}
}