本题使用dfs即可
#include<iostream>
#include<cstring>
#pragma(disable: 4996)
using namespace std;
const int N = 15;
int a[N][N], solve[N], t, num, m;
//a为题中给定数组
//solve为题目的状态,0表示未解决,1表示解决
//t为给出的问题数目
//num为检索过程中的“已解决数目”
//m为最大可解数目
void dfs(int k, int cost) {
for (int i = 0; i < t; i++) {
if (a[k][i] >= cost && solve[i] == 0)
break;//如果存在可以“继续解决”的下一个问题,则结束循环,去“解决”这个问题
if (i == t - 1 && (a[k][i] < cost || solve[i] == 1)) {
if (num > m)//经过检索发现以经没有可以“继续解决”的问题了,则判断当前解决的问题数目是否为最多
m = num;
return;
}
}
for (int i = 0; i < t; i++)
if (a[k][i] >= cost && solve[i] == 0) {
solve[i] = 1;
num++;
dfs(i, a[k][i]);
solve[i] = 0;
num--;
}
}
int main() {
while (cin >> t) {
m = 1;
num = 1;
memset(solve, 0, sizeof(solve));
for (int i = 0; i < t; i++)
for (int j = 0; j < t; j++)
scanf("%d", &a[i][j]);
solve[0] = 1;
dfs(0 ,0);
cout << m << endl;
}
return 0;
}