這個題思路沒有任何問題,但還是做了近三個小時,其中2個多小時除錯
得到的經驗有以下幾點:
- 一定學會除錯,掌握輸出中間量的技巧,加強gdb除錯的學習
- 有時候程式碼不對,得到的結果卻是對的(之後總結以下常見錯誤)
- 能用結構體,就別用陣列,容易出錯(暫時還不知道為什麼)=>現在知道申請的陣列空間在執行期間被釋放,除非用malloc去申請陣列
- 程式碼要規範,空格該有就要有
- 有些不規範表示式,不同編譯器出現不同結果,注意應避免使用這類語句
像這道題主要坑在了第三點上,以後要注意避免
以下是AC程式碼
第一次完成時間(大於2小時)
#include <cstdio> #include <stack> #include <cstring> #include <cctype> const int MAXN=1000+10; using namespace std; char exps[MAXN]; struct Matrix { int a, b; Matrix(int a = 0,int b = 0):a(a), b(b) {} }m[26]; stack<Matrix> s; int main(){ #ifdef DEBUG freopen("6.3.in","r",stdin); #endif int n; scanf("%d\r",&n); for(int i=0;i<n;i++){ char s0[10]; char c; scanf("%c ",&c); s0[0]=c; scanf("%d %d\r\n",&m[s0[0] -'A'].a, &m[s0[0] -'A'].b); //printf("%c %d %d\r\n",s0[0] , m[s0[0] -'A'].a , m[s0[0]-'A'].b); } while(scanf("%s",exps)==1){ int sum=0; int len=strlen(exps); int ok=1; for(int i=0;i<len;i++){ if(isalpha(exps[i])){ s.push(m[exps[i]-'A']); // printf("push %d %d \n",m[exps[i]-'A'].a,m[exps[i]-'A'].b); } else if(exps[i]==')'){ Matrix m2 = s.top(); s.pop(); // printf("pop %d %d \n", m2.a, m2.b); Matrix m1 = s.top(); s.pop(); // printf("pop %d %d \n", m1.a, m1.b); if(m1.b != m2.a){ok=0;break;} sum+= m1.a * m1.b * m2.b; s.push(Matrix(m1.a, m2.b)); // printf("push %d %d \n",m1.a, m2.b,); } } if(ok)printf("%d\n",sum); else printf("error\n"); } return 0; }
第二次練習程式碼(完成時間約1小時)
1 //UVa 442,Matrix Chain Multiplication 2 //Example:6-3 3 //Author:wzh 4 //Date: 2016.8.26 5 //Version 2 6 7 #include <cstdio> 8 #include <cstring> 9 #include <cctype> 10 #include <stack> 11 #include <cstdlib> 12 using namespace std; 13 #define maxn 30 14 int s[maxn][2]; 15 char buf[1000]; 16 int main(){ 17 #ifdef D 18 freopen("442.in","r",stdin); 19 #endif 20 int n; 21 scanf("%d ",&n); 22 for(int i=0;i<n;i++){ 23 char c;int a,b; 24 scanf("%c",&c); 25 scanf("%d%d ",&s[c-'A'][0],&s[c-'A'][1]); 26 //printf("%c %d %d\n",c,s[c-'A'][0],s[c-'A'][1]); 27 } 28 29 while(fgets(buf,10000,stdin)){ 30 int len=strlen(buf); 31 stack<int*> sk; 32 int sum=0; 33 int ok=1; 34 for(int i=0;i<len;i++){ 35 if(buf[i]==')'){ 36 int *a,*b,*c; 37 b=sk.top();sk.pop(); 38 //printf("pop%d %d\n",b[0],b[1]); 39 a=sk.top();sk.pop(); 40 // printf("pop%d %d\n",a[0],a[1]); 41 if(a[1]==b[0]){ 42 sum+=(a[0]*a[1]*b[1]); 43 c=(int*)malloc(sizeof(int)*2); 44 c[0]=a[0]; 45 c[1]=b[1]; 46 sk.push(c); 47 // printf("push*%d %d\n",c[0],c[1]); 48 } 49 else{ 50 ok=0; 51 break; 52 } 53 } 54 else if(isalpha(buf[i])){ 55 sk.push(s[buf[i]-'A']); 56 //printf("push%d %d\n",s[buf[i]-'A'][0],s[buf[i]-'A'][1]); 57 } 58 } 59 if(ok)printf("%d\n",sum); 60 else printf("error\n"); 61 } 62 return 0; 63 }