1.26——寒假练习
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.26——寒假练习相关的知识,希望对你有一定的参考价值。
UVA10010
好像说这道题我做了好久~快哭了~最后还是利用了udebug那个网站,才找到了bug
这道题收获很大对于我这个代码能力不强的人,基础知识不牢的人来说多练练还是有好处的~
1.思路:这道题给定一个二维数组,然后给你多个字符串,问你这些字符串在这个二维数组中是否能找到,重点是:方向有八个:向上,向下,向左,向右,左上,左下,右上,右下。所以读懂题意非常重要!
2.一个很重要的bug就是想说
while(str[x++][y]==test[t++]); while(a++==b++);
上面这两句代码不一样:
第一行的意思是,先x++,t++,再比较;
第二行的意思是先判断ab是否相等,a++,b++;
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 using namespace std; 5 int m,n,T; 6 char str[55][55]; 7 char test[55]; 8 int len; 9 int call(int x,int y,int len){ 10 //向左 11 if(x+1-len>=0){ 12 //printf("1...........\n"); 13 int i=x,j=y; 14 int t=0; 15 // printf("%c %c",str[i][j],test[t]); 16 while(t<len&&str[i][j]==test[t]){ 17 i--;t++; 18 } 19 // printf("%d\\\\\t",t); 20 if(t==len)return 1; 21 22 } 23 //向右 24 if(m-x>=len){ 25 //printf("2...........\n"); 26 int i=x,j=y; 27 int t=0; 28 while(str[i][j]==test[t]&&t<len){ 29 i++; 30 t++; 31 } 32 if(t==len)return 1; 33 } 34 //向上 35 if(y+1-len>=0){ 36 //printf("3...........\n"); 37 int i=x,j=y; 38 int t=0; 39 while(str[i][j]==test[t]&&t<len){ 40 j--; 41 t++; 42 } 43 if(t==len)return 1; 44 } 45 //向下 46 if(n-y>=len){ 47 //printf("4...........\n"); 48 int i=x,j=y; 49 int t=0; 50 while(str[i][j]==test[t]&&t<len){ 51 j++;t++; 52 } 53 if(t==len)return 1; 54 } 55 //左上-+ 56 if(x+1-len>=0&&n-y>=len){ 57 // printf("5...........\n"); 58 int i=x,j=y; 59 int t=0; 60 while(str[i][j]==test[t]&&t<len){ 61 i--;j++;t++; 62 } 63 if(t==len)return 1; 64 } 65 //右上+- 66 if(m-x>=len&&y+1-len>=0){ 67 //printf("6...........\n"); 68 int i=x,j=y; 69 int t=0; 70 while(str[i][j]==test[t]&&t<len){ 71 i++;j--;t++; 72 } 73 if(t==len)return 1; 74 } 75 //左下-- 76 if(y+1-len>=0&&x+1-len>=0){ 77 //printf("7...........\n"); 78 int i=x,j=y; 79 int t=0; 80 while(str[i][j]==test[t]&&t<len){ 81 i--;j--;t++; 82 } 83 if(t==len)return 1; 84 } 85 //右下++ 86 if(n-y>=len&&m-x>=len){ 87 //printf("8...........\n"); 88 int i=x,j=y; 89 int t=0; 90 while(str[i][j]==test[t]&&t<len){ 91 i++;j++;t++; 92 } 93 if(t==len)return 1; 94 } 95 return 0; 96 } 97 int main(){ 98 //freopen("10010.txt","r",stdin); 99 //freopen("10011.txt","w",stdout); 100 int z; 101 scanf("%d",&T); 102 while(T--){ 103 getchar(); 104 scanf("%d%d",&m,&n); 105 for(int i=0;i<m;i++){ 106 scanf("%s",&str[i]); 107 } 108 for(int x=0;x<m;x++){ 109 for(int y=0;y<n;y++){ 110 if(str[x][y]>=‘A‘&&str[x][y]<=‘Z‘){ 111 str[x][y]+=32; 112 } 113 } 114 } 115 scanf("%d",&z); 116 while(z--){ 117 scanf("%s",test); 118 int len=strlen(test); 119 for(int i=0;i<len;i++){ 120 if(test[i]>=‘A‘&&test[i]<=‘Z‘){ 121 test[i]+=32; 122 //printf("%c ",test[i]); 123 } 124 } 125 int p=0; 126 for(int x=0;x<m;x++){ 127 for(int y=0;y<n;y++){ 128 if(str[x][y]==test[0]){ 129 if(call(x,y,len)){ 130 printf("%d %d\n",x+1,y+1); 131 p=1; 132 break; 133 } 134 } 135 136 } 137 if(p)break; 138 } 139 } 140 if(T!=0)printf("\n"); 141 } 142 return 0; 143 }
UVA10361
这道题真的是很折腾人啊~
一句话,不能轻视水题~虽然这题一点都不水~
1.题意:很简单的s1<s2>s3<s4>s5;第一个行的字符串把左右括号去掉输出,第二行把...变成s3<s2><s1><s4>输出即可;
2.思路:还是用最简单的一个一个字符查找,通过将上面的后四个字符存到四个数组中,然后按照输出要求的顺序输出。
3.我错的一个重要的地方就是两个gets函数中间使用了getchar,本意是为了过滤掉回车的,然而百度之后,得知,gets函数是读到回车结束,但是回车不存入数组中!!!!
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int main(){ char l1[105],l2[105]; char a[5][105]; int T; // freopen("10010.txt","r",stdin); // freopen("10011.txt","w",stdout); scanf("%d",&T); getchar(); while(T--){ gets(l1); //getchar(); gets(l2); // printf("%s %s",l1,l2); int w=0; int len=strlen(l1); int k=0; while(k<len){ if(l1[k]==‘<‘){ k++; int i; i=0; while(l1[k]!=‘>‘){ a[w][i++]=l1[k]; k++; } a[w][i++]=‘\0‘; w++; k++; i=0; while(l1[k]!=‘<‘){ a[w][i++]=l1[k]; k++; } k++; a[w][i++]=‘\0‘; w++; i=0; while(l1[k]!=‘>‘){ a[w][i++]=l1[k]; k++; } a[w][i++]=‘\0‘; w++; i=0; k++; while(i<len){ a[w][i++]=l1[k]; k++; } a[w][i++]=‘\0‘; }else k++; } /* for(int i=0;i<=w;i++){ printf("%s\n",a[i]); }*/ int num=0; while(num<len){ if(l1[num]!=‘<‘&&l1[num]!=‘>‘){ printf("%c",l1[num]); } num++; } printf("\n"); int num1=0; int lens=strlen(l2); while(num1<lens){ if(l2[num1]==‘.‘){ printf("%s%s%s%s",a[2],a[1],a[0],a[3]); break; } printf("%c",l2[num1]); num1++; } printf("\n"); } return 0; }
附录:
仅仅做了两道水题就发现我还是基础不牢~还是需要多学习多努力!
意识到大学没有多长时间可以再搞ACM了,所以我想按照日记的形式记录我最后的ACM学习生涯~加油!坚持!
以上是关于1.26——寒假练习的主要内容,如果未能解决你的问题,请参考以下文章
寒假每日一题回文平方(个人练习)详细题解+推导证明(第五天)