电子表格数据结构2
數據結構+模擬。
給出一個R行C列的電子表格,行編號A~T, 列編號0~9,按照行優先的順序給出各個單元格。每個單元格可能是整數也可能是引用了其他單元格的表達式,表達式僅由加減號、非負整數、單元格名稱組成,沒有括號,且以單元格名稱開頭,內部不含空白符,最多75個字符。要求計算出所有單元格的值,如果所有的單元格都能成功計算出結果,那么將這張表格輸出來,每個元素6個占字符的寬度,對齊。如果出現單元格循環引用以致無法輸出,則將無法正常計算出結果的單元格及其表達式輸出,仍按照行優先的順序輸出。詳細格式參見樣例。
按照題意模擬即可,需要注意的地方有表達式的讀取以及數據結構的選用。
這里先將表達式中數字部分先保存在表中,然后將表達式中對單元格的引用單獨保存起來,讀取全部輸入之后dfs計算結果,如果循環則將對應單元格標記為計算失敗,并將結果放入set中,最后輸出即可。
#include <iostream> #include <iomanip> #include <sstream> #include <string> #include <vector> #include <set> #include <cstdio> #include <cctype> using namespace std; int r, c, size; vector<pair<int, int> > pt[256]; int ss[256]; string ss_s[256]; bool ok_all; set<int> put_false; bool ok[256]; bool vis[256]; int dfs(const int &pos) { if(!ok[pos]) { ok_all = false; return 0; } if(pt[pos].empty()) return ss[pos]; if(vis[pos]) { ok[pos] = false; ok_all = false; put_false.insert(pos); return 0; } vis[pos] = true; for(auto it = pt[pos].begin(); it != pt[pos].end(); ++it) { if(ok[it->first]) ss[pos] += (it->second) * dfs(it->first); if(!ok[it->first]) { ok[pos] = false; ok_all = false; put_false.insert(pos); } } pt[pos].clear(); return ss[pos]; } int main() { ios::sync_with_stdio(false); while(cin >> r >> c && r && c) { size = r * c; for(int i = 0; i != size; ++i) { pt[i].clear(); ss[i] = 0; string ele; cin >> ele; ss_s[i] = ele; vector<int> sign; if(ele[0] == '-') sign.push_back(-1); else sign.push_back(1); for(auto it = ele.begin(); it != ele.end(); ++it) { if(*it == '-') sign.push_back(-1), *it = ' '; else if(*it == '+') sign.push_back(1), *it = ' '; } istringstream line(ele); auto it = sign.begin(); while(line >> ele) { if(isdigit(ele[0])) { istringstream t(ele); int d; t >> d; ss[i] += d * (*it++); } else { int pos = (ele[0] - 'A') * c + ele[1] - '0'; pt[i].push_back(pair<int, int>(pos, *it++)); } } } ok_all = true; put_false.clear(); for(int i = 0; i != size; ++i) ok[i] = true, vis[i] = false; for(int i = 0; i != size; ++i) dfs(i); if(!ok_all) { for(auto it = put_false.begin(); it != put_false.end(); ++it) cout << (char)(*it / c + 'A') << *it % c << ": " << ss_s[*it] << endl; } else { cout << ' '; for(int i = 0; i != c; ++i) cout << setw(6) << i; cout << endl; for(int i = 0; i != r; ++i) { cout << (char)(i + 'A'); for(int j = 0; j != c; ++j) cout << setw(6) << ss[i * c + j]; cout << endl; } } cout << endl; } }轉載于:https://www.cnblogs.com/szp123/p/6500752.html
總結
- 上一篇: WPF usercontrol 自定义依
- 下一篇: Linux特殊权限:SUID、SGID、