题目
代码
#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-8;
unordered_map<string, int> e;
int eidx, midx; //eidx 元素数, midx 物质数
double matrix[45][45];
int q;
bool check_alpha(char c)
{
if(c >= 'a' && c <= 'z') return true;
return false;
}
bool gauss(int n, int m)
{
//if(n < m) return false;
int c, r, t;
for(c = 1, r = 1; c <= m; c++)
{
t = r;
for(int i = r+1; i <= n; i++) //找主元
{
if(fabs(matrix[i][c]) > fabs(matrix[t][c])) t = i;
}
if(fabs(matrix[t][c]) < eps) continue;
for(int i = c; i <= m+1; i++) //交换
{
swap(matrix[r][i], matrix[t][i]);
}
for(int i = m+1; i >= c; i--) //归一化
{
matrix[r][i] /= matrix[r][c];
}
for(int i = r+1; i <= n; i++) //上三角化
{
for(int j = m+1; j >= c; j--)
{
matrix[i][j] -= matrix[i][c] * matrix[r][j];
}
}
r++;
}
if((r-1) < m) return true;
else return false;
}
int main()
{
cin >> q;
while (q -- ){
memset(matrix, 0, sizeof matrix);
e.clear();
eidx = 0;
cin >> midx;
for(int i = 1; i <= midx; i++)
{
string s;
cin >> s;
string name = "";
for(int j = 0; s[j] != '\0'; j++)
{
if(!check_alpha(s[j]))
{
string num = "";
num += s[j];
while(s[++j] != '\0' && !check_alpha(s[j]))
{
num += s[j];
}
j--;
if(!e.count(name)) e[name] = ++eidx;
matrix[e[name]][i] = stoi(num);
name = "";
}
else name += s[j];
}
}
if(gauss(eidx, midx)) cout << "Y" << endl;
else cout << "N" << endl;
}
}