XidianOJ 1095 派对

题目描述

Matrix67发现身高接近的人似乎更合得来。Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排在圆桌上。Matrix67的安排原则是,圆桌上任意两个相邻人的身高之差不能超过K。请告诉Matrix67他共有多少种安排方法。

输入

多组数据
第一行输入两个用空格隔开的数N和K,其中1<=N<=10,1<=K<=1 000 000。
第二行到第N+1行每行输入一个人的身高值。所有人的身高都是不超过1 000 000的正整数

输出

输出符合要求的安排总数

--正文
N非常小,直接一个一个摆过去试试就好
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int height[11];
int visit[11];
int table[11];
int n,k;
int res = 0;

int my_abs(int a){
    if (a<0) return -a;
    return a;
}

bool canPos(int i,int height){
    if (i == 1) return true;
    if (i == n){
        if ( my_abs(height-table[i-1]) <= k && my_abs(height - table[1]) <= k){
            return true;
        }
        else return false;
    }
    else if (my_abs(height-table[i-1]) <= k){
        return true;
    }
    else return false;
}

void pos(int now){
    int i;
    if (now == n+1) {
//        for (i=1;i<=n;i++){
//            printf("%d ",table[i]);
//        } printf("
");
        
        res ++;
        return;
    }
    for (i=1;i<=n;i++){
//        if (now==1 && table[1] = 16){
//            printf("HERE!
");
//        }
//        if (table[1] == 16 && table[2] == 6 && table[3] == 2){
//            printf("HERE!
");
//        }
        if (!visit[i] && canPos(now,height[i])){
            table[now] = height[i];
            visit[i] = 1;
            pos(now+1);
            table[now] = 0;
            visit[i] = 0;
        }
    }
}

int main(){
    while (scanf("%d %d",&n,&k) != EOF){
        int i;
        res = 0;
        memset(visit,0,sizeof(visit));
        memset(table,0,sizeof(table));
        for (i=1;i<=n;i++) scanf("%d",&height[i]);
        pos(1);
        printf("%d
",res/n);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/ToTOrz/p/6143235.html