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;}elsea[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;elsecout << "N" << endl;}return 0;
}