ccf-csp #201903-4 消息传递接口
生活随笔
收集整理的這篇文章主要介紹了
ccf-csp #201903-4 消息传递接口
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://118.190.20.162/view.page?gpid=T86
題目思路
第一次看這道題的時候,感覺像是僅可以可在左邊這個面操作的消消樂。然后每一行可以用一個隊列來存儲,當該行第一個元素被消掉后,只需要把它push出來就可以了。
由于思路存在以下問題,最后還是參考了別人的博客。
看了dalao的博客后,有了以下思路:
- 通過隊列數組來存儲各個進程,每次挑選一個指令不為空的進程(preprepre),通過讀取進程隊列的第一個指令等待的進程編號決定下一個要訪問進程(nextnextnext)。
- 當 nextnextnext 要訪問的進程恰好是 preprepre ,且他們分別為R和S,則把它們消掉。否則,把當前訪問的進程標志為preprepre,然后 把 nextnextnext 置為 preprepre 的第一個指令等待的進程編號(類似于鏈表訪問下一個元素的操作)。
- 當所有的進程隊列都為空時結束模擬。
- 至于死鎖判斷,當等待的進程已經訪問過且同為R或S(說明出現了環),或者等待的進程其指令已經為空(等待不會出現的東西),說明出現了死鎖。
代碼如下
#include <bits/stdc++.h>using namespace std; typedef long long ll; const int maxn = 1e4 + 10; struct Node {// id表示要訪問進程的id int id, sr; }; int T, n; string str; queue<Node> q[maxn]; // q[i]表示第i號進程 int vis[maxn]; //用于檢測有沒有環(死鎖) void init() {for (int j = 0; j < n; j++) {getline(cin, str);for (int i = 0; i < str.length(); i++) {Node node;node.sr = (str[i++] == 'R' ? 1 : 0);int t = 0;while (i < str.length() && str[i] != ' ')t = t * 10 + str[i++] - '0';node.id = t;q[j].push(node);}} }void solve() {int flag = 1;while (flag) {flag = 0;memset(vis, 0, sizeof(vis));int pre = 0;while (pre < n && q[pre].empty()) pre++;if (pre == n) break;int next = q[pre].front().id;vis[pre] = 1;// 當訪問已經訪問過或者已經沒有指令的進程,說明出現死鎖。 while (!vis[next] && !q[next].empty()) {vis[next] = 1;// 滿足消除條件 if (q[next].front().id == pre && q[next].front().sr != q[pre].front().sr) {flag = 1;q[next].pop();q[pre].pop();break;}// 類似于鏈表訪問一下元素的操作 pre = next;next = q[pre].front().id;}}int ans = 0;for (int i = 0; i < n; i++) {//如果進程指令不為空,說明出現死鎖 if (!q[i].empty()) {ans = 1;// 進程指令的清空操作 while (!q[i].empty()) q[i].pop();}}printf("%d\n", ans); }int main() {//freopen("1.in", "r", stdin);scanf("%d %d", &T, &n);getchar();while (T--) {init();solve();}return 0; }最后,還是談談踩到的坑:
參考博客:CSP 201903-4 消息傳遞接口(模擬題) 滿分
總結
以上是生活随笔為你收集整理的ccf-csp #201903-4 消息传递接口的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决Eclipse查看源代码出现Sour
- 下一篇: CF#1288A Deadline (函