A
求最小数(Output the minimum)
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
每次给定3个数(均可用int表示),要求找出3个数里的最小的一个,并输出最小的数。
Input three integers and output the minimum
Input three integers and output the minimum
输入
a b c 三个数用空格隔开
Input three integers .
Input three integers .
输出
a b c中最小的一个数
Output the minimum .
Output the minimum .
输入样例
5 3 98
输出样例
3
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int a,b,c; 5 int ans; 6 int main() 7 { 8 cin>>a>>b>>c; 9 ans=a; 10 if(a>b) ans=b; 11 if(c<ans) ans=c; 12 cout<<ans<<endl; 13 14 return 0; 15 }
B
十进制转二进制
时限:100ms 内存限制:10000K 总时限:1000ms
描述
将一个10进制的数转换为二进制数。
输入
输入一个10000位以内的十进制数。
输出
转换为二进制后输出。
输入样例
1030
输出样例
10000000110
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 int n; 8 int main() 9 { 10 int ans[1000],num=0; 11 cin>>n; 12 while(n){ 13 if(n&1) ans[num]=1; 14 else ans[num]=0; 15 n=n>>1; 16 num++; 17 } 18 for(int i=num-1;i>=0;i--){ 19 if(i==num-1) printf("%d",ans[i]); 20 else printf("%d",ans[i]); 21 } 22 cout<<endl; 23 return 0; 24 }
C
迷宫
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
有一个迷宫,迷宫里有一个人,迷宫是规格为N*N的方格,人处于某一位置,可以选择向上下左右方向前进,但是要保证面对的不是墙壁,否则无法向前行走。
输入
迷宫的规格,用一个正整数N (2<=N<=20)表示,占一行;输入一对数据m,n(第m行,第n列),表示人所在的位置坐标,以空格隔开,占一行;输入要尝试的前进方向,“w”“s”“a”“d”分别代表上、下、左、右,占一行。
输出
“Y”
表示可以向该方向前进;最后一行输出回车
“N”
表示无法向该方向前进;最后一行输出回车
表示可以向该方向前进;最后一行输出回车
“N”
表示无法向该方向前进;最后一行输出回车
输入样例
4
0 3
s
0 3
s
输出样例
Y
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 int n; 8 int m,t; 9 char str; 10 int main() 11 { 12 cin>>t; 13 cin>>n>>m; 14 cin>>str; 15 if(str=='w'){ 16 if(n==0) printf("N "); 17 else printf("Y "); 18 } 19 else if(str=='s'){ 20 if(n==t-1) printf("N "); 21 else printf("Y "); 22 } 23 else if(str=='a'){ 24 if(m==0) printf("N "); 25 else printf("Y "); 26 } 27 else if(str=='d'){ 28 if(m==t-1) printf("N "); 29 else printf("Y "); 30 } 31 return 0; 32 }
D
又一个迷宫
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
有一个迷宫,迷宫里有一个人,迷宫是规格为N*N的方格,房内特定位置上有障碍物,人处于某一位置,可以选择向上下左右方向前进,但是要保证面对的不是墙壁或是障碍物,否则无法向前行走。
输入
迷宫的规格,一个正整数N (2<=N<=100),占一行,代表矩阵大小;输入方形矩阵N行N列,由0和1组成,其中0代表空地,1代表障碍物;输入一对数据m,n(第m行,第n列),表示人所在的位置坐标(保证人所在的位置为“0”,即空地),以空格隔开,占一行;输入一个整数表示要尝试的前进方向,0、1、2、3分别代表左、下、右、上。
输出
“Y”
表示可以向该方向前进
“N”
表示无法向该方向前进
输出占一行。
表示可以向该方向前进
“N”
表示无法向该方向前进
输出占一行。
输入样例
4
1 0 0 0
1 1 1 0
0 0 1 0
1 0 0 1
0 3
1
1 0 0 0
1 1 1 0
0 0 1 0
1 0 0 1
0 3
1
输出样例
Y
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 int n; 8 int m,t; 9 int str; 10 int mat[107][107]; 11 int main() 12 { 13 cin>>t; 14 for(int i=0;i<t;i++) 15 for(int j=0;j<t;j++) 16 { 17 scanf("%d",&mat[i][j]); 18 } 19 cin>>n>>m; 20 cin>>str; 21 if(str==0){ 22 if(m-1>=0&&mat[n][m-1]==0) printf("Y "); 23 else printf("N "); 24 } 25 else if(str==1){ 26 if(n+1<t&&mat[n+1][m]==0) printf("Y "); 27 else printf("N "); 28 } 29 else if(str==2){ 30 if(m+1<t&&mat[n][m+1]==0) printf("Y "); 31 else printf("N "); 32 } 33 else if(str==3){ 34 if(n-1>=0&&mat[n-1][m]==0) printf("Y "); 35 else printf("N "); 36 } 37 return 0; 38 }
E
字符串替换
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
输入三个字符串a,b和c,将a中b的第一次出现替换为c。
输入
输入三行,每行一个字符串,字符串长度不超过255。
输出
如果b有出现在a中,输出替换后的字符串,否则输出原串a。
输入样例
abcdefgh
cde
Xiaolan
cde
Xiaolan
输出样例
abXiaolanfgh
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<string> 6 #include<iostream> 7 using namespace std; 8 char a[300],b[300],c[300]; 9 int ff() 10 { 11 int l1=strlen(a),l2=strlen(b); 12 int j=0; 13 for(int i=0;i<l1;i++) 14 { 15 j=0; 16 while(a[i+j]==b[j]){ 17 j++; 18 if(j==l2) return i; 19 } 20 } 21 } 22 int main() 23 { 24 //freopen("in.txt","r",stdin); 25 cin>>a;cin>>b;cin>>c; 26 int point=ff(); 27 int i; 28 for(i=0;i<point;i++) 29 { 30 printf("%c",a[i]); 31 } 32 for(i=0;i<strlen(c);i++) printf("%c",c[i]); 33 for(i=point+strlen(b);i<strlen(a);i++) 34 printf("%c",a[i]); 35 cout<<endl; 36 }
F
六数码问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
现有一两行三列的表格如下:
A B C
D E F
把1、2、3、4、5、6六个数字分别填入A、B、C、D、E、F格子中,每个格子一个数字且各不相同。每种不同的填法称为一种布局。如下:
1 3 5
2 4 6
布局1
2 5 6
4 3 1
布局2
定义α变换如下:把A格中的数字放入B格,把B格中的数字放入E格,把E格中的数字放入D格,把D格中的数字放入A格。
定义β变换如下:把B格中的数字放入C格,把C格中的数字放入F格,把F格中的数字放入E格,把E格中的数字放入B格。
问:对于给定的布局,可否通过有限次的α变换和β变换变成下面的目标布局:
1 2 3
4 5 6
A B C
D E F
把1、2、3、4、5、6六个数字分别填入A、B、C、D、E、F格子中,每个格子一个数字且各不相同。每种不同的填法称为一种布局。如下:
1 3 5
2 4 6
布局1
2 5 6
4 3 1
布局2
定义α变换如下:把A格中的数字放入B格,把B格中的数字放入E格,把E格中的数字放入D格,把D格中的数字放入A格。
定义β变换如下:把B格中的数字放入C格,把C格中的数字放入F格,把F格中的数字放入E格,把E格中的数字放入B格。
问:对于给定的布局,可否通过有限次的α变换和β变换变成下面的目标布局:
1 2 3
4 5 6
输入
本题有多个测例,第一行为输入测例的个数n,下面是n行测例,每个测例的输入是1到6这六个数字的一个排列,空格隔开,表示初始布局ABCDEF格中依次填入的数字。
输出
每个输出占一行。输出转换到目标格局需要变换的最少次数。(若不能转换则输出-1)
输入样例
2
2 5 3 1 4 6
2 3 6 1 5 4
2 5 3 1 4 6
2 3 6 1 5 4
输出样例
1
2
2
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 struct node 7 { 8 int a[6],num; 9 }; 10 int top,base; 11 node q[10000]; 12 int n,aa[6]; 13 int ans; 14 bool ff; 15 bool flag[666666]; 16 bool judge(int point) 17 { 18 return !flag[point]; 19 } 20 int get_num(int aa[]) 21 { 22 return aa[0]+aa[1]*10+aa[2]*100+aa[3]*1000+aa[4]*10000+aa[5]*100000; 23 } 24 void get1() 25 { 26 aa[1]=q[base].a[0]; 27 aa[4]=q[base].a[1]; 28 aa[3]=q[base].a[4]; 29 aa[0]=q[base].a[3]; 30 aa[2]=q[base].a[2]; 31 aa[5]=q[base].a[5]; 32 } 33 void get2() 34 { 35 aa[0]=q[base].a[0]; 36 aa[3]=q[base].a[3]; 37 aa[1]=q[base].a[4]; 38 aa[2]=q[base].a[1]; 39 aa[5]=q[base].a[2]; 40 aa[4]=q[base].a[5]; 41 } 42 bool can() 43 { 44 for(int i=0;i<6;i++) 45 if(q[base].a[i]!=i+1) return 0; 46 return 1; 47 } 48 void paste(int a1[],int a2[]) 49 { 50 for(int i=0;i<6;i++) a1[i]=a2[i]; 51 } 52 void bfs() 53 { 54 while(base<top){ 55 if(can()){ans=q[base].num;ff=1;return;} 56 get1(); 57 int point=get_num(aa); 58 if(judge(point)){ 59 flag[point]=1; 60 q[top].num=q[base].num+1; 61 paste(q[top++].a,aa); 62 } 63 get2(); 64 point=get_num(aa); 65 if(judge(point)){ 66 flag[point]=1; 67 q[top].num=q[base].num+1; 68 paste(q[top++].a,aa); 69 } 70 base++; 71 } 72 } 73 int main() 74 { 75 node n1; 76 scanf("%d",&n); 77 while(n--){ 78 for(int i=0;i<6;i++) scanf("%d",&q[0].a[i]); 79 ff=0; 80 top=base=0;q[0].num=0;top=1; 81 memset(flag,0,sizeof(flag)); 82 int point=get_num(q[0].a); 84 flag[point]=1; 85 bfs(); 86 if(!ff) printf("-1 "); 87 else printf("%d ",ans); 88 } 89 return 0; 90 }
G
1422.输出命题公式的真值表
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
先输入一个正整数n(n小于等于10),表示共有n个命题变元,再输入一个类似于逆波兰表达式的字符串表示一个命题公式,约定在该字符串中用一位的十进制数表示一个命题变元,用a、o、n、i、e分别表示且、或、非、蕴含、等值,用类似于逆波兰表达式形式的字符串表示的命题公式的真值表波兰表达式(即二元运算,两个操作数在前,运算符在后;一元运算,一个操作数在前,运算符在后)。
输入
先输入一个小于等于10的正整数n,再输入一个字符串。
输出
输出该字符串表示的命题公式的真值表。
提示:
如果用P、Q、R分别表示这三个命题变元的话,
输入数据01a2i表示的命题公式是:((P∧Q)→R)
输入数据012ia表示的命题公式是:(P∧(Q→R))
输入数据0n表示的命题公式是:┐P
提示:
如果用P、Q、R分别表示这三个命题变元的话,
输入数据01a2i表示的命题公式是:((P∧Q)→R)
输入数据012ia表示的命题公式是:(P∧(Q→R))
输入数据0n表示的命题公式是:┐P
输入样例
3
01a2i
01a2i
输出样例
0 0 0 1
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 1
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 0
1 1 1 1
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stack> 6 using namespace std; 7 stack<int> s; 8 int n,l; 9 char str[100]; 10 int ans[20]; 11 void slove() 12 { 13 int top=1; 14 while(!s.empty()) s.pop(); 15 char s1,s2,n1,n2; 16 for(int i=0;i<l;i++) 17 { 18 if(str[i]=='a') 19 { 20 s2=s.top();s.pop(); 21 s1=s.top();s.pop(); 22 if(s1=='0'||s2=='0') s.push('0'); 23 else s.push('1'); 24 } 25 else if(str[i]=='o') 26 { 27 s2=s.top();s.pop(); 28 s1=s.top();s.pop(); 29 if(s1=='0'&&s2=='0') s.push('0'); 30 else s.push('1'); 31 } 32 else if(str[i]=='i') 33 { 34 s2=s.top();s.pop(); 35 s1=s.top();s.pop(); 36 if(s1=='1'&&s2=='0') s.push('0'); 37 else s.push('1'); 38 } 39 else if(str[i]=='e') 40 { 41 s2=s.top();s.pop(); 42 s1=s.top();s.pop(); 43 if(s1==s2) s.push('1'); 44 else s.push('0'); 45 } 46 else if(str[i]=='n') 47 { 48 s1=s.top();s.pop(); 49 if(s1=='0') s.push('1'); 50 else s.push('0'); 51 } 52 else{ 53 char c=ans[top++]+'0'; 54 s.push(c); 55 } 56 } 57 } 58 void print() 59 { 60 for(int i=1;i<=n;i++) 61 printf("%d ",ans[i]); 62 printf("%c ",s.top()); 63 } 64 void dfs(int point) 65 { 66 if(point>n) {slove();print();return;} 67 for(int i=0;i<2;i++) 68 { 69 ans[point]=i; 70 dfs(point+1); 71 } 72 } 73 74 int main() 75 { 76 scanf("%d",&n); 77 scanf("%s",str); 78 l=strlen(str); 79 dfs(1); 80 return 0; 81 }
H
计算单词的个数
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
给以行句子,写一个程序判断它有几个单词。
输入
输入占一行,行尾有空格,并且只含有大写字母和小写字母和空格。
输出
单词的个数。
例如:
printf("%d "),num;
例如:
printf("%d "),num;
输入样例
General game players are systems able to
输出样例
7
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<string> 6 #include<iostream> 7 using namespace std; 8 char a[10007]; 9 int main() 10 { 11 //freopen("in.txt","r",stdin); 12 int ans=0; 13 cin.getline(a,10002); 14 int l=strlen(a); 15 for(int i=0;i<l;i++) 16 if(a[i]==' '&&i>0&&a[i-1]!=' ') ans++; 17 cout<<ans<<endl; 18 }
I
连阴雨
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
因为连续的降雨,我们学校操场上出现了许多水坑,现在需要统计一共有多少个水坑。
题目输入为一个N譓 (1 <= N <= 100; 1 <= M <= 100)的图,('W') 代表积水,('.')代表干燥。一处积水我们认为和它周围的八个方向相邻,相邻的积水构成一个水坑。
需要输出一个数字,表示一共有多少个互不相邻的水坑。
题目输入为一个N譓 (1 <= N <= 100; 1 <= M <= 100)的图,('W') 代表积水,('.')代表干燥。一处积水我们认为和它周围的八个方向相邻,相邻的积水构成一个水坑。
需要输出一个数字,表示一共有多少个互不相邻的水坑。
输入
第一行:两个正整数n和m。
第二行到第n+1行:输入操场信息,每一点的状态只可能是'W' 或者'.'。
第二行到第n+1行:输入操场信息,每一点的状态只可能是'W' 或者'.'。
输出
输出一个正整数,表示不相邻的水坑的数目。
输入样例
10 12
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
W........WW.
.WWW.....WWW
....WW...WW.
.........WW.
.........W..
..W......W..
.W.W.....WW.
W.W.W.....W.
.W.W......W.
..W.......W.
输出样例
3
//这题西工大的测试数据好像出错了,poj上有这个的原题
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 int n,m; 7 char mat[1007][1007]; 8 int q[1000007]; 9 int next[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1}; 10 bool flag[1007][1007]; 11 bool t; 12 bool can(int i,int j) 13 { 14 if(i>=0&&i<n&&j>=0&&j<m&&!flag[i][j]&&mat[i][j]!='.') return 1; 15 return 0; 16 } 17 void bfs(int point) 18 { 19 int top=0,base=0,l,r,ll,rr; 20 q[top++]=point; 21 while(base<top){ 22 l=q[base]/m;r=q[base]%m; 23 for(int i=0;i<8;i++) 24 { 25 ll=l+next[i][0];rr=r+next[i][1]; 26 if(can(ll,rr)){ 27 t=1; 28 flag[ll][rr]=1; 29 q[top++]=ll*m+rr; 30 } 31 } 32 base++; 33 } 34 } 35 int main() 36 { 37 while(~scanf("%d%d",&n,&m)){ 38 int i,j;char c; 39 t=0; 40 for(int i=0;i<n;i++) 41 { 42 c=getchar(); 43 for(int j=0;j<m;j++) 44 { 45 46 c=getchar(); 47 mat[i][j]=c; 48 49 } 50 } 51 memset(flag,0,sizeof(flag)); 52 long long ans=0; 53 for(i=0;i<n;i++) 54 for(j=0;j<m;j++) 55 { 56 if(!flag[i][j]&&mat[i][j]!='.') 57 { 58 t=0; 59 flag[i][j]=1; 60 ans++; 61 bfs(i*m+j); 62 } 63 } 64 cout<<ans<<endl;} 65 return 0; 66 }