#include <iostream>
#include <vector>
using namespace std;
int n,m;
string str;
bool st[30];
void dfs(int cnt)
{
if(cnt == m){
for(int i = 0;i < m;i ++){
printf("%c",str[i]);
}
printf("\n");
return;
}
for(int i = 0;i < n;i ++){
char c = i + 'A';
if(st[i]) continue;
str = str + c;
st[i] = true;
dfs(cnt + 1);
st[i] = false;
str.pop_back();
}
}
int main()
{
scanf("%d%d",&n,&m);
dfs(0);
return 0;
}
/*
AB
AC
BA
BC
CA
CB
*/
7-65 八皇后问题 (20 分)
#include <stdio.h>
#include <math.h>
int queenPlaces[92][8]; //存放92种皇后棋子的摆放方法
int count = 0;
int board[8][8]; //仿真棋盘
void putQueen(int ithQueen); //递归函数,每次摆好一个棋子
int main()
{
int n, i, j;
for(i = 0; i < 8; i++){ // 初始化
for(j = 0; j < 8; j++)
board[i][j] = -1;
for(j = 0; j < 92; j++)
queenPlaces[j][i] = 0;
}
putQueen(0); //从第0个棋子开始摆放,运行的结果是将queenPlaces生成好
scanf("%d", &n);
for(i = 0; i < n; i++){
int ith;
scanf("%d", &ith);
for(j = 0; j < 8; j++)
printf("%d", queenPlaces[ith - 1][j]);
printf("\n");
}
}
void putQueen(int ithQueen){
int i, k, r;
if(ithQueen == 8){
count ++;
return;
}
for(i = 0; i < 8; i++){
if(board[i][ithQueen] == -1){
//摆放皇后
board[i][ithQueen] = ithQueen;
//将其后所有的摆放方法的第ith个皇后都放在i+1的位置上
//在i增加以后,后面的第ith个皇后摆放方法后覆盖此时的设置
for(k = count; k < 92; k++)
queenPlaces[k][ithQueen] = i + 1;
//设置控制范围
for(k = 0; k < 8; k++)
for(r = 0; r < 8; r++)
if(board[k][r] == -1 &&
(k == i || r == ithQueen || abs(k - i) == abs(r - ithQueen)))
board[k][r] = ithQueen;
//向下级递归
putQueen(ithQueen + 1);
//回溯,撤销控制范围
for(k = 0; k < 8; k++)
for(r = 0; r < 8; r++)
if(board[k][r] == ithQueen) board[k][r] = -1;
}
}
}
7-66 旅行售货员 (10 分)
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int n;
vector<int> path;
const int N = 10;
int g[N][N];
int ans = 0x3f3f3f3f;
void dfs(int u, int state)
{
if (u == n)
{
int sum = 0;
for(int i = 0;i < path.size() - 1;i ++){
sum += g[path[i]][path[i + 1]];
}
sum += g[path[path.size() - 1]][path[0]];
// cout << endl;
ans = min(ans,sum);
return;
}
for (int i = 0; i < n; i ++ )
if (!(state >> i & 1))
{
path.push_back(i + 1);
dfs(u + 1, state + (1 << i));
path.pop_back();
}
}
int main()
{
cin >> n;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
cin >> g[i][j];
dfs(0, 0);
cout << ans << endl;
return 0;
}