寒假ACM訓練(二)
阿新 • • 發佈:2019-01-22
放了假的效率明顯就低起來,最近也一直在學習Ubuntu,所以一直等到今天才寫。
還是在用PC.
真的十分鬱悶這個LC-Display,其實從思路上是有很多。不過我最後把他當成8字,分成了七筆。
一直WA,一開始是以為那n=0時候出問題。其實我覺得我把問題弄複雜了。還用了棧(因為懶惰,不想花多心機去琢磨用char 陣列去讀取。)
思路就是:一個巨大的陣列,一個ind指明所載入的數字開始列,之後暴力列舉。
#include<iostream> #include<stack> using namespace std; char t[150][1000]; void set(int ind,int n,int s){ int i; switch(n){ case 1: for( i=0;i<s;i++) t[0][i+ind+1]='-'; break; case 4: for( i=0;i<s;i++) t[s+1][i+ind+1]='-'; break; case 7: for( i=0;i<s;i++) t[2*s+2][i+ind+1]='-'; break; case 2: for( i=0;i<s;i++) t[i+1][ind]='|'; break; case 3: for( i=0;i<s;i++){ t[i+1][ind+s+1]='|'; } break; case 5: for( i=0;i<s;i++) t[s+2+i][ind]='|'; break; case 6: for( i=0;i<s;i++) t[s+2+i][ind+s+1]='|'; break; case 8: for(i=0;i<2*s+3;i++) t[i][ind]=' '; break; } } void fun(int n,int s){ stack<int> tmp; do{ tmp.push(n%10); n/=10; }while(n); int siz=tmp.size(); int ind=0; while(!tmp.empty()){ if(ind!=0){ set(ind,8,s); ind++; } int nq=tmp.top(); tmp.pop(); for(int vv=0;vv<2*s+3;vv++) for(int uu=0;uu<s+2;uu++) t[vv][uu+ind]=' '; int l=ind; int z=l; switch(nq){ case 0: set(ind,1,s); set(ind,2,s); set(ind,3,s); set(ind,5,s); set(ind,6,s); set(ind,7,s); break; case 1: set(ind,3,s); set(ind,6,s); break; case 2: set(ind,1,s); //set(ind,2,s); set(ind,3,s); set(ind,4,s); set(ind,5,s); // set(ind,6,s); set(ind,7,s); break; case 3: set(ind,1,s); // set(ind,2,s); set(ind,3,s); set(ind,4,s); // set(ind,5,s); set(ind,6,s); set(ind,7,s); break; case 4: // set(ind,1,s); set(ind,2,s); set(ind,3,s); set(ind,4,s); // set(ind,5,s); set(ind,6,s); // set(ind,7,s); break; case 5: set(ind,1,s); set(ind,2,s); //set(ind,3,s); set(ind,4,s); //set(ind,5,s); set(ind,6,s); set(ind,7,s); break; case 6: set(ind,1,s); set(ind,2,s); set(ind,4,s); set(ind,5,s); set(ind,6,s); set(ind,7,s); break; case 7: set(ind,1,s); set(ind,3,s); set(ind,6,s); break; case 8: set(ind,1,s); set(ind,2,s); set(ind,3,s); set(ind,4,s); set(ind,5,s); set(ind,6,s); set(ind,7,s); break; case 9: set(ind,1,s); set(ind,2,s); set(ind,3,s); set(ind,4,s); set(ind,6,s); set(ind,7,s); break; } ind=ind+s+2; } for(int v=0;v<2*s+3;v++){ for(int u=0;u<siz*(s+2)+siz-1;u++){ if(t[v][u]=='|'||t[v][u]=='-') cout<<t[v][u]; else cout<<" "; } cout<<endl; } } int main(){ int s; int n; while(cin>>s>>n&&(s||n)){ fun(n,s); cout<<endl; } return 0; }
對於PC110105,本人提交了4次,WA3次,第一次是因為泛洪時候遞迴沒有先賦值,第二次是因為在畫矩形時候沒有比較大小,第三次試因為我把‘O’看成了’0‘,讓我糾結了好長一段時間,真心累。本題加上哨兵,應該還是很和諧的。
#include<iostream> using namespace std; char pc[260][260]; void fun(int m,int n,int x,int y,char c,char d){ if(x<=0||y<=0||x>m||y>n) return; if(pc[x][y]==d||pc[x][y]!=c) return; pc[x][y]=d; fun(m,n,x,y+1,c,d); fun(m,n,x,y-1,c,d); fun(m,n,x+1,y,c,d); fun(m,n,x-1,y,c,d); } int main(){ int m,n; char Ord; char name[500000]={0}; while(cin>>Ord){ if(Ord=='X') break; else if(Ord=='I'){ cin>>n>>m; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) pc[i][j]='O'; }else if(Ord=='C'){ for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) pc[i][j]='O'; }else if(Ord=='L'){ int x,y;char CC; cin>>y>>x; cin>>CC; pc[x][y]=CC; }else if(Ord=='V'){ int x,y,y1;char CC; int tmp; cin>>x>>y>>y1; cin>>CC; if(y>y1){ tmp=y; y=y1; y1=tmp; } for(tmp=y;tmp<=y1;tmp++) pc[tmp][x]=CC; }else if(Ord=='H'){ int x,x1,y;char CC; int tmp; cin>>x>>x1>>y; cin>>CC; if(x>x1){ tmp=x; x=x1; x1=tmp; } for(tmp=x;tmp<=x1;tmp++) pc[y][tmp]=CC; }else if(Ord=='K'){ int x1,y1,x2,y2; char CC; cin>>y1>>x1>>y2>>x2; cin>>CC; int tmp; if(x1>x2){ tmp=x1; x1=x2; x2=tmp; } if(y1>y2){ tmp=y1; y1=y2; y2=tmp; } for(int i=x1;i<=x2;i++) for(int j=y1;j<=y2;j++) pc[i][j]=CC; }else if(Ord=='F'){ int x,y; char CC; cin>>y>>x; cin>>CC; fun(m,n,x,y,pc[x][y],CC); }else if(Ord=='S'){ cin>>name; cout<<name<<endl; for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++) cout<<pc[i][j]; cout<<endl; } } } return 0; }
對於PC110106,這題目實在讓人費解,關鍵就在與輸入輸出流上,忽略空行。
#include <iostream> #include <cstdlib> #include <cstring> using namespace std; int reg[15],ram[1010]; int fun(int &ind){ int step=0; int n=ram[ind]; //abc int c=n%10; n/=10; int b=n%10; n/=10; int a=n; // cout<<a<<b<<c; //abc if(a==1&&b==0&&c==0){ ind++; return -1; }else if(a==2){ reg[b]=c; }else if(a==3){ reg[b]+=c; }else if(a==4){ reg[b]*=c; }else if(a==5){ reg[b]=reg[c]; }else if(a==6){ reg[b]+=reg[c]; }else if(a==7){ reg[b]*=reg[c]; }else if(a==8){ reg[b]=ram[reg[c]]; }else if(a==9){ ram[reg[c]]=reg[b]; }else if(a==0){ if(reg[c]!=0){ ind=reg[b]; return 1; } } reg[b]%=1000; step++; ind++; return step; } int main(int argc, char *argv[]) { string line; int n; cin>>n; cin.ignore(); getline(cin, line); while(n--){ memset(reg,0,sizeof(reg)); memset(ram,0,sizeof(ram)); for (int i = 0; getline(cin, line) && line.length(); i++) ram[i] = atoi(line.data()); int ind=0; int step=0; while(true){ int tmp=fun(ind); if(tmp==-1){ step++; break; } step+=tmp; } cout<<step<<endl; if(n) cout<<endl; } return 0; }