1.计算最多有多少种摆法;
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
#include <iterator>
using namespace std;
typedef unsigned long long ULL;
int book[3][20];
int m[10][10];
int maxi;
void dfs(int cur)
{
if(cur==8)
{
maxi++;
return ;
}
for(int i=0;i<8;i++)
if(!book[0][i]&&!book[1][cur+i+1]&&!book[2][cur-i+8])
{
book[0][i]=book[1][cur+i+1]=book[2][cur-i+8]=1;
dfs(cur+1);
book[0][i]=book[1][cur+i+1]=book[2][cur-i+8]=0;
}
}
int main()
{
int n;
cin>>n;
while(n--)
{
maxi=0;
memset(book,0,sizeof(book));
memset(m,0,sizeof(m));
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
cin>>m[i][j];
dfs(0);
cout<<maxi<<endl;
}
return 0;
}
/*
*/
2.计算所有摆法中相加之和最大;
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
#include <iterator>
using namespace std;
typedef unsigned long long ULL;
int book[3][20];
int m[10][10];
int maxi;
void dfs(int cur,int sum)
{
if(cur==8)
{
if(maxi<sum)
maxi=sum;
return ;
}
for(int i=0;i<8;i++)
if(!book[0][i]&&!book[1][cur+i+1]&&!book[2][cur-i+8])
{
book[0][i]=book[1][cur+i+1]=book[2][cur-i+8]=1;
dfs(cur+1,sum+m[cur][i]);
book[0][i]=book[1][cur+i+1]=book[2][cur-i+8]=0;
}
}
int main()
{
int n;
cin>>n;
while(n--)
{
maxi=0;
memset(book,0,sizeof(book));
memset(m,0,sizeof(m));
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
cin>>m[i][j];
dfs(0,0);
cout<<maxi<<endl;
}
return 0;
}
/*
*/
3.打印所有的八皇后放置位置,数组下标表示行,值表示列
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
#include <iterator>
using namespace std;
typedef unsigned long long ULL;
int book[3][20];
int sol[100][10];
int temp[10];
int l=0,k=0;
void dfs(int cur)
{
if(cur==8)
{
for(int i=0;i<8;i++)
sol[l][i]=temp[i];
l++;
return ;
}
for(int i=0;i<8;i++)
{
if(!book[0][i]&&!book[1][cur+i+1]&&!book[2][cur-i+8])
{
temp[cur]=i;
book[0][i]=book[1][cur+i+1]=book[2][cur-i+8]=1;
dfs(cur+1);
book[0][i]=book[1][cur+i+1]=book[2][cur-i+8]=0;
}
}
}
int main()
{
dfs(0);
for(int i=0;i<l;i++)
{
for(int j=0;j<8;j++)
cout<<sol[i][j]+1;
cout<<endl;
}
return 0;
}
/*
*/
book[0]表示列,cur表示行;
book[1]表示副斜线;
book[2]表示主斜线;
并且在八皇后问题中
主斜线是行坐标-列坐标+8;
副斜线是行坐标+列坐标+1;