简单的回溯题目
#include <stdio.h>
#include <string.h>
#include <set>
using namespace std;
struct node
{
int a;
int b;
int c;
int s;
};
struct node arr[100];
struct node solution[4];
bool visited[100];
bool vis[10];
int case_count;
int max_score;
void dfs(int cur, int node_num)
{
int i;
if(4 == cur)
{
int sum;
sum = solution[1].s + solution[2].s + solution[3].s;
if(max_score < sum)
max_score = sum;
return;
}
for(i=1; i<=node_num; i++)
{
if(visited[i])
continue;
if(cur == 1)
{
visited[i] = true;
memcpy(solution+cur, arr+i, sizeof(struct node));
vis[arr[i].a] = vis[arr[i].b] = vis[arr[i].c] = true;
dfs(cur+1, node_num);
visited[i] = false;
vis[arr[i].a] = vis[arr[i].b] = vis[arr[i].c] = false;
}
else
{
if(!vis[arr[i].a] && !vis[arr[i].b] && !vis[arr[i].c])
{
visited[i] = true;
vis[arr[i].a] = vis[arr[i].b] = vis[arr[i].c] = true;
memcpy(solution+cur, arr+i, sizeof(struct node));
dfs(cur+1, node_num);
visited[i] = false;
vis[arr[i].a] = vis[arr[i].b] = vis[arr[i].c] = false;
}
}
}
}
void func(int n)
{
max_score = -1;
for(int i=1; i<=n; i++)
visited[i] = false;
for(int i=1; i<=9; i++)
vis[i] = false;
dfs(1, n);
printf("Case %d: %d\n", case_count, max_score);
}
int main(void)
{
int n, i;
//freopen("input.dat", "r", stdin);
while(scanf("%d",&n), n)
{
for(i=1; i<=n; i++)
scanf("%d %d %d %d", &(arr[i].a), &(arr[i].b), &(arr[i].c), &(arr[i].s));
case_count ++;
func(n);
}
}