uva 11218 KTV

来源:互联网 发布:表白网页源码下载 编辑:程序博客网 时间:2024/06/10 18:49

简单的回溯题目

#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);}}


原创粉丝点击