简单八皇后问题
#include<iostream>
#include<cstring>
using namespace std;
int visited[20][20]={false};
char pos[20][20];
int ans=0;
int search(int i,int j,int n,int m)//i是行,j是列
{
if(i<0||i>=n||j<0||j>=m||visited[i][j]||pos[i][j]=='#')
return 0;
visited[i][j]=true;
++ans;
search(i-1,j,n,m);
search(i+1,j,n,m);
search(i,j-1,n,m);
search(i,j+1,n,m);
return ans;
}
int main()
{
int n,m,num;
int i,j;
int s,t;
cin>>m>>n;
while(n!=0||m!=0)
{
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>pos[i][j];
if(pos[i][j]=='@')
{
s=i;
t=j;
}
}
}
num=search(s,t,n,m);
cout<<num<<endl;
ans=0;
memset(pos,0,sizeof(pos));
memset(visited, 0, sizeof(visited));
cin>>m>>n;
}
return 0;
}
深度八皇后
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
using namespace std;
int p[30][30];
bool col[30]={0},le[30]={0},ri[30]={0};
int res=0;
void bfs(int row,int cnt)
{
int i,lie;
int ld,rd;
if(row==8)
{
res=max(res,cnt);
return;
}
for(lie=0;lie<8;lie++)
{
ld=row-lie+7;
rd=row+lie;
if(col[lie]==0&&le[ld]==0&&ri[rd]==0)
{
col[lie]=le[ld]=ri[rd]=1;
bfs(row+1,cnt+p[row][lie]);
col[lie]=le[ld]=ri[rd]=0;
}
}
return;
}
int main()
{
int k;
int i,j;
cin>>k;
while(k--)
{
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
cin>>p[i][j];
}
}
res=0;
memset(le,0,sizeof(le));
memset(ri,0,sizeof(ri));
memset(col,0,sizeof(col));
bfs(0,0);
printf("%5d\n",res);
}
return 0;
}