日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lotto(DFS处理)

發布時間:2023/12/9 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lotto(DFS处理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目再現

題目內容: 給定N個數字,再從中選定M個數字出來。 將每一種組合內的數字由小到大排列之后, 將所有組合按照字典序排列, 請你找出第X組的第Y個數字。 給定的數字為1~N。 范例1 (N,M,X,Y) = (5,2,8,2) 所有組合按順序排列為:(1 2), (1 3), (1 4), (1 5), (2 3),(2 4), (2 5), (3 4), (3 5), (4 5) 所以第8組第2個數字為4。輸入格式: 第一行有一個數字T代表有多少組測資。 每一組測資有一行, 第一行四個數字N、M、X、Y, 意義如題目所述。 測資范圍: T < 1000 1 < N < 12 1 < M < N 0 < X <= C(N, M) 0 < Y <= N輸出格式: 對于每一筆測資,找出第X組第Y個數字。 將所有測資的答案加總后再輸出。輸入樣例: 2 5 2 8 2 6 3 7 3輸出樣例: 10 時間限制:500ms內存限制:32000kb

算法實現

這個題可以通過DFS獲取所有的序列,通過box數組記錄序列信息,在獲取序列的時候使用計數器判斷需要找的位置。

#include <stdio.h> #include <string.h>int book[12], box[12]; int times; long long sum = 0;void dfs(int step, int n, int m, int x, int y){int i;if(step >= m){times ++;if(times == x){sum += box[y - 1];}return;}for(i = 1; i <= n; i ++){if(book[i - 1] == 0){if(step >= 1 && box[step - 1] > i){continue;}box[step] = i;book[i - 1] = 1;dfs(step + 1, n, m, x, y);book[i - 1] = 0;}} }int main(){int T;int N, M, X, Y;scanf("%d", &T);while(T --){memset(book, 0, sizeof(book));times = 0;scanf("%d %d %d %d", &N, &M, &X, &Y);dfs(0, N, M, X, Y);}printf("%lld", sum);return 0; }

拓展閱讀

小談深度優先搜索


博客名稱:王樂平博客

博客地址:http://blog.lepingde.com

CSDN博客地址:http://blog.csdn.net/lecepin



總結

以上是生活随笔為你收集整理的Lotto(DFS处理)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。