寒假ACM训练(二)

放了假的效率明显就低起来,最近也一直在学习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;


}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值