模擬題
這道題一個是要處理輸入,這個用gets()就好, 另一個就是要判斷當前是否死鎖, 如果死鎖了的話就需要跳出循環, 直接返回, 這個地方寫不好容易超時
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 10010;
int state[N], cur[N]; // cur表示當前第i號進程處理到了哪一條指令(str[i]的第幾個位置)後的那個空格
int T, n;
char str[N][100];
bool done[N];
queue<int> q;
// str[i][idx]開始的數字
int get_number(int i, int idx)
{
char *p = str[i];
int res = 0;
while(p[idx] >= '0' && p[idx] <= '9')
{
res = res * 10 + p[idx] - '0';
idx ++;
}
return res;
}
int get_len(int x)
{
int cnt = 0;
if(!x)
return 1;
while(x)
{
cnt ++;
x /= 10;
}
return cnt;
}
void work()
{
// 用隊列來保存當前未死鎖的進程, 這樣方便用於判斷函數終止
while(q.size())
{
auto i = q.front();
q.pop();
int idx = cur[i]; // 跳過R和S
if(idx != -1 && str[i][idx] == '\0') continue; else idx ++;
if(state[i] != i) continue;
if(str[i][idx] == 'S')
{
int t = get_number(i, idx + 1);
if(state[i] == i)
{
state[i] = t;
if(state[t] == -i)
{
state[t] = t;
state[i] = i;
q.push(t);
q.push(i);
}
}
cur[i] = idx + 1 + get_len(t);
}
else if(str[i][idx] == 'R')
{
int t = get_number(i, idx + 1);
if(state[i] == i)
{
state[i] = -t;
if(state[t] == i)
{
state[t] = t;
state[i] = i;
q.push(t);
q.push(i);
}
}
cur[i] = idx + 1 + get_len(t);
}
}
}
int main()
{
cin >> T >> n;
getchar();
while(T --)
{
memset(cur, -1, sizeof cur);
memset(done, false, sizeof done);
for(int i = 0; i < n; ++i) state[i] = i;
for(int i = 0; i < n; ++i) gets(str[i]);
for(int i = 0; i < n; ++i) q.push(i);
work();
bool has_ans = true;
for(int i = 0; i < n; ++i)
if(state[i] != i)
{
has_ans = false;
break;
}
if(has_ans) cout << 0 << endl;
else cout << 1 << endl;
}
return 0;
}