3-6 UVA232
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a,b;
int k=1;int d;
int x;
int t=0;
int book[11][11];//判断是否起始
int vis[11][11];
char puzzle[11][11];
char ch;
int main()
{
while((cin>>a)&&a)
{
if(t)
{
cout<<endl;
}
t++;
cin>>b;
memset(puzzle,0,sizeof(puzzle));
memset(book,0,sizeof(book));
d=1;
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
cin>>ch;
puzzle[i][j]=ch;
}
}
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
if(puzzle[i][j]!='*')
{
if(i==0||j==0||puzzle[i-1][j]=='*'||puzzle[i][j-1]=='*')
{
book[i][j]=d++;//标记为起始格
}
}
}
}
printf("puzzle #%d:\n",k++);
printf("Across\n");
memset(vis,0,sizeof(vis));
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
if(book[i][j]!=0&&!vis[i][j])
{
printf("%3d.%c",book[i][j],puzzle[i][j]);
x=j;
while(puzzle[i][x+1]!='*'&&x<b-1)
{
vis[i][x+1]=1;
printf("%c",puzzle[i][++x]);
}
printf("\n");
}
}
}
printf("Down\n");
memset(vis,0,sizeof(vis));
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
if(book[i][j]!=0&&!vis[i][j])
{
printf("%3d.%c",book[i][j],puzzle[i][j]);
x=i;
while(puzzle[x+1][j]!='*'&&x<a-1)
{
vis[x+1][j]=1;
printf("%c",puzzle[++x][j]);
}
printf("\n");
}
}
}
}
return 0;
}
3-7 UVA1368
//思路:所求的DNA序列的第n个字节的值应该是所给的全部DNA序列中第n位中出现最多的字母
// 这样距离才能最小。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int m,n,t,mark;
int maxh,sum;
char a[51][1005];
char answer[1005];
char s[4]={'A','C','G','T'};
int num[4];
int main()
{
cin>>t;
while(t--)
{
memset(a,0,sizeof(a));
memset(answer,0,sizeof(answer));
cin>>m>>n;
for(int i=0;i<m;i++)
{
cin>>a[i];
}
sum=0;
for(int i=0;i<n;i++)
{
maxh=0;
for(int k=0;k<4;k++)
{
num[k]=0;
for(int j=0;j<m;j++)
{
if(a[j][i]==s[k])
{
num[k]++;
}
}
if(num[k]>maxh)
{
maxh=num[k];
mark=k;
}
}
sum+=maxh;
answer[i]=s[mark];
cout<<answer[i];
}
cout<<endl<<(n*m-sum)<<endl;
}
return 0;
}
3-8 UVA202
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a,b;
int shang[10005];
int yu[10005];
int mark[10005];
int pos[10005];
int i,j,flag;
int main()
{
while(cin>>a>>b)
{
memset(shang,0,sizeof(shang));
memset(yu,0,sizeof(yu));
memset(mark,0,sizeof(mark));
memset(pos,0,sizeof(pos));
i=0;flag=0;
cout<<a<<"/"<<b<<" = ";
while(1)
{
shang[i]=a/b;
yu[i]=a%b;
if(yu[i]==0)
{
flag=1;
break;
}
else if(mark[a%b]==0)
{
mark[a%b]=1;
pos[a%b]=i;
}
else
{
break;
}
a=yu[i]*10;
i++;
}
cout<<shang[0]<<".";
if(flag==1)//有限小数
{
if(i<51)
{
for(j=1;j<=i;j++)
{
cout<<shang[j];
}
cout<<"(0)"<<endl;
}
else
{
for(j=1;j<=50;j++)
{
cout<<shang[j];
}
cout<<"..."<<endl;
}
cout<<" 1 = number of digits in repeating cycle"<<endl;
}
else if(flag==0)//无限循环小数 小数点后位数50之内
{
if(i<51){
for(j=1;j<=pos[yu[i]];j++)
{
cout<<shang[j];
}
cout<<"(";
for(int j=pos[yu[i]]+1;j<=i;j++)
{
cout<<shang[j];
}
cout<<")"<<endl;
cout<<" "<<i-pos[yu[i]]<<" = number of digits in repeating cycle"<<endl;
}
else
{
if(pos[yu[i]]>=51)
{
for(int j=1;j<=50;j++)
{
cout<<shang[j];
}
cout<<"..."<<endl;
}
else
{
for(j=1;j<=pos[yu[i]];j++)
{
cout<<shang[j];
}
cout<<"(";
for(int j=pos[yu[i]]+1;j<=50;j++)
{
cout<<shang[j];
}
cout<<"...";
cout<<")"<<endl;
cout<<" "<<i-pos[yu[i]]<<" = number of digits in repeating cycle"<<endl;
}
}
}
cout<<endl;
}
return 0;
}
3-9 UVA10340
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[1000005];
char t[1000005];
int main()
{
while(cin>>s>>t)
{
int j=0;
for(int i=0;i<int(strlen(t));i++)
{
if(s[j]==t[i])
{
j++;
}
if(j==int(strlen(s)))
{
cout<<"Yes"<<endl;
break;
}
}
if(j<int(strlen(s)))
{
cout<<"No"<<endl;
}
memset(s,0,sizeof(s));
memset(t,0,sizeof(t));
}
return 0;
}
3-10 UVA1587
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a[6][2];
int b[3][2];
int t[2];
int i=0;
int x,y;
int vis[6];
int num;
int flag;
void resort()
{
if(b[0][0]>b[1][0])
{
t[0]=b[0][0];t[1]=b[0][1];
b[0][0]=b[1][0];b[0][1]=b[1][1];
b[1][0]=t[0];b[1][1]=t[1];
}
if(b[0][0]>b[2][0])
{
t[0]=b[0][0];t[1]=b[0][1];
b[0][0]=b[2][0];b[0][1]=b[2][1];
b[2][0]=t[0];b[2][1]=t[1];
}
if(b[1][0]>b[2][0])
{
t[0]=b[1][0];t[1]=b[1][1];
b[1][0]=b[2][0];b[1][1]=b[2][1];
b[2][0]=t[0];b[2][1]=t[1];
}
}
int issame(int ii,int jj)
{
if(a[ii][0]==a[jj][0]&&a[ii][1]==a[jj][1])
{
return 1;
}
return 0;
}
void judge()
{
num=0;
flag=0;
for(int i=0;i<6;i++)
{
for(int j=i+1;j<6;j++)
{
if(issame(i,j)&&!vis[i]&&!vis[j])
{
b[num][0]=a[i][0];
b[num][1]=a[i][1];
num++;
vis[i]=1;
vis[j]=1;
}
}
}
if(num==3)
{
flag=1;
}
resort();
if(flag==1&&b[0][0]==b[1][0]&&((b[0][1]==b[2][0]&&b[1][1]==b[2][1])||(b[0][1]==b[2][1]&&b[1][1]==b[2][0])))
{
cout<<"POSSIBLE"<<endl;
}
else
{
cout<<"IMPOSSIBLE"<<endl;
}
}
int main()
{
memset(vis,0,sizeof(vis));
while(cin>>x>>y)
{
a[i%6][0]=min(x,y);
a[i%6][1]=max(x,y);
i++;
if(i%6==0)
{
memset(vis,0,sizeof(vis));
judge();
}
}
return 0;
}
3-11 UVA1588
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[205],b[205];
int len1,len2;
int chong,flag,minx,miny;
int mover(char s1[],char s2[])//先上方后下方 向右移动
{
len1=strlen(s1);//上方
len2=strlen(s2);//下方
minx=len1+len2;
miny=len1+len2;
for(int i=0;i<=len2;i++)//上方右移的距离
{
if(i+len1<len2){chong=len1;}
else{chong=len2-i;}
flag=0;//假设可以移动
for(int j=i;j<i+chong;j++)
{
if(s2[j]=='2'&&s1[j-i]=='2')
{
flag=1;//表示不能移动此距离
break;
}
}
if(flag==0)
{
if(len1+len2-chong<minx)
{
minx=len1+len2-chong;
}
}
}
for(int i=0;i<=len1;i++)//下方右移的距离
{
if(i+len2<len1){chong=len2;}
else{chong=len1-i;}
flag=0;
for(int j=i;j<i+chong;j++)
{
if(s1[j]=='2'&&s2[j-i]=='2')
{
flag=1;
break;
}
}
if(flag==0)
{
if(len1+len2-chong<miny)
{
miny=len1+len2-chong;
}
}
}
return (min(minx,miny));
}
int main()
{
while(cin>>a>>b)
{
//a数组作为基准数组,不进行移动
//从左向右移动b数组
cout<<mover(a,b)<<endl;
}
return 0;
}
3-12 UVA11809
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char a[100];
double A[10][31];
long long B[10][31];
double m;
long long e;
int main()
{
for(int i=0;i<=9;i++)//M
for(int j=1;j<=30;j++)//E
{
m=(1-pow(2,-1-i));
e=pow(2,j)-1;
B[i][j]=(long long)(log10(m)+e*log10(2));
A[i][j]=pow(10,log10(m)+e*log10(2)-B[i][j]);
}
while((cin>>a)&&strcmp(a,"0e0"))
{
*(strchr(a,'e'))=' ';
sscanf(a,"%lf %lld",&m,&e);
if(m<1)
{
m*=10;
e-=1;
}
for(int i=0;i<=9;i++)
for(int j=1;j<=30;j++)
{
if(B[i][j]==e&&fabs(A[i][j]-m)<0.0001)
{
cout<<i<<" "<<j<<endl;
break;
}
}
}
return 0;
}
后记:3-12浮点数打表做,参考博客: https://blog.csdn.net/shannonnansen/article/details/42059693
补充两个知识点:
①C 库函数 char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。str是要被检索的字符串,c是在str中要搜索的字符。该函数返回在字符串str中第一次出现c的位置,如未找到返回NULL。
②C 库函数 int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入。
str是源字符串,format是说明符,如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
C 库函数 int sprintf(char *str, const char *format, ...) 发送格式化输出到 str 所指向的字符串。
str是指向一个字符数组的指针,该数组存储了 C 字符串;format是说明符;如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
eg:
#include<math.h>
sprintf(str,"PI的值=%f",M_PI);
则str为:"Pi 的值 = 3.141593"