模拟题
这道题一个是要处理输入,这个用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;
}