/*
**排列宝石问题
*/
#include <stdio.h>
#include <iostream>
using namespace std;
#define N 9
int shape[N][N];//棋盘记录石子的形状
int color[N][N];//记录棋盘石子的颜色
bool stone[N][N];//stone[i][j]表示i形状的j颜色的石子是否已经用过
int cnt = 0;
int n = 0;
//row行,col列
bool isOK(int row, int col)
{
if (stone[shape[row][col]][color[row][col]])
{
//如果石子没有被用过
//检查这一行
for (int i = 1; i < col; i++)
{
if (shape[row][i] == shape[row][col] || color[row][i] == color[row][col])
{
return false;
}
}
//检查这一列
for (int j = 1; j < row; j++)
{
if (shape[j][col] == shape[row][col] || color[j][col] == color[row][col])
{
return false;
}
}
return true;
}
else
{
//如果石子已经被用过
return false;
}
}
void Swap(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
}
//从上到下,从左到右回溯,row代表行,col代表列
void BackTrace(int row, int col)
{
if (row > n)
{
//排完了最后一行
cnt++;
return;
}
else if (col > n)
{
//一行排序完毕,排序下一行
BackTrace(row + 1, 1);
}
else
{
for (int i = col; i <= n; i++)
{
//排列形状
Swap(shape[row][col], shape[row][i]);
for (int j = col; j <= n; j++)
{
//排列颜色
Swap(color[row][col], color[row][j]);
if (isOK(row, col))
{
stone[shape[row][col]][color[row][col]] = false;
BackTrace(row, col + 1);
stone[shape[row][col]][color[row][col]] = true;
}
Swap(color[row][col], color[row][j]);
}
Swap(shape[row][col], shape[row][i]);
}
}
}
int main()
{
while(cin >> n){
//初始化工作
cnt = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
color[i][j] = j;
shape[i][j] = j;
stone[i][j] = true;
}
}
BackTrace(1, 1);
printf("%d\n", cnt);
}
return 0;
}
11111111
最新推荐文章于 2021-02-15 00:33:34 发布