試題編號: 201903-4
試題名稱: 消息傳遞接口
時間限制: 1.0s
內存限制: 512.0MB
問題描述:
這是一個來自操做系統的問題,要求判斷是否會產生死鎖,當發送方與接收方不匹配的時候就陷入了死鎖。簡單的模擬一下遞歸過程,用隊列來記錄每一組操做,p表示從頭開始遍歷的操做,q表示p指向的操做,若是pq恰好匹配,則出隊,若不匹配,則用v數組記錄該組已經遍歷,若v均爲1,則表示全部的操做遍歷完畢。此時判斷全部隊列,若均爲空,則輸出沒有死鎖。c++
#include<bits/stdc++.h> using namespace std; struct mmp { int num; bool flag; }; queue<mmp>str[10005]; void clear(queue<mmp>& q) { queue<mmp> empty; swap(empty, q); } int main() { int t,n; cin>>t>>n; getchar(); while(t--) { for(int i=0; i<n; i++) clear(str[i]); string line; for(int i=0; i<n; ++i) { getline(cin,line); stringstream ss(line); string tmp; mmp temp; while(ss>>tmp) { temp.flag=tmp.substr(0,1)=="S"?true:false; temp.num=stoi(tmp.substr(1)); str[i].push(temp); } } int v[10005] = {0},is_change = 1; while(is_change) { int p=0,q; memset(v,0,sizeof(v)); is_change=0; while(p < n && str[p].empty()) p++; if(p==n) break; q=str[p].front().num; while(!is_change&&!v[q]&&!str[q].empty()) { v[q]=1; if(str[q].front().num==p&&str[p].front().flag!=str[q].front().flag) { is_change=1; str[p].pop(); str[q].pop(); break; } p=q; q=str[p].front().num; } } bool ans=true; for(int i=0; i<n; ++i) if(!str[i].empty()) { ans=false; break; } if(ans) cout<<0<<endl; else cout<<1<<endl; } return 0; } /* 3 2 R1 S1 S0 R0 R1 S1 R0 S0 R1 R1 R1 R1 S1 S1 S1 S1 S0 S0 S0 S0 R0 R0 R0 R0 */