100分代码:
check():检查每个字符串中元素及其数量
did(int i , int x , int y):将第 i 行的第 y 个数前都是0,第 y 个数开始不是0,根据第 x 行将第 i 行第 y 个数开始的数变成0
map<string , int>mp : 将元素 和 数字编号 相对应
setst : 给每一个元素对应一个数字编号,顺序就是进入set的顺序,也就是出现的顺序
double a[50][50] : a[i][j]表示编号为 i 的字符串出现在第 j 个式子中的数量
res : 高斯消元后最终的秩
m : 未知数的个数
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 110;
const int MAXT = 10000;
int n , m;
map<string , int>mp;
set<string>st;
double a[50][50];
void check(string s , int x){
int len = s.size();
for(int i = 0 ; i < len ; i++){
string z = "";
int k = 0;
if(s[i] >= 'a' && s[i] <= 'z'){
z += s[i];
while(s[i+1] >= 'a' && s[i+1] <= 'z'){
z += s[i+1];
i++;
}
i++;
if(s[i] >= '0' && s[i] <= '9'){
k = k * 10 + (s[i] - '0');
while(s[i+1] >= '0' && s[i+1] <= '9'){
k = k * 10 + (s[i+1] - '0');
i++;
}
}
if(st.find(z) == st.end()){
st.insert(z);
mp[z] = st.size();
a[mp[z]][x] = k;
}
else
a[mp[z]][x] = k;
}
}
}
void did(int i , int x , int y){
double k1 = a[i][y] ;
double k2 = a[x][y];
for(int j = 0 ; j < m ; j++){
a[i][j] = a[i][j] - a[x][j] * k1 / k2;
}
}
int main(){
cin >> n;
while(n--){
cin >> m;
mp.clear();
st.clear();
memset(a , 0.0 , sizeof(a));
for(int i = 0 ; i < m ; i++){
string s;
cin >> s;
check(s,i);
}
if(st.size() == 1){
cout << "Y" << endl;
continue;
}
for(int i = 2 ; i <= st.size() ; i++){
for(int j = 0 ; j < m ; j++){
if(a[i][j] == 0)
continue;
int num1 = -1;
int num2 = -1;
for(int z = 1 ; z < i ; z++){
for(int k = 0 ; k < m ; k++){
if(a[z][k] == 0)
continue;
else{
if(k == j){
num1 = z;
num2 = k;
break;
}
break;
}
}
if(num1 != -1)
break;
}
if(num1 == -1)
break;
did(i,num1,num2);
j = -1;
}
}
int res = 0;
for(int i = 1 ; i <= st.size() ; i++){
for(int j = 0 ; j < m ; j++){
if(a[i][j] == 0)
continue;
else{
res++;
break;
}
}
}
if(res < m)
cout << "Y" << endl;
else
cout << "N" << endl;
}
return 0;
}