这是我大一C语言课OJ的练习题,这节为35~54道.记录一下,无关难易。
35、使用函数验证哥德巴赫猜想
本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。
输入两个正整数m和n(0<=m<=n<=100),将m和n之间的偶数表示成两个素数之和,输出时每行显示5组。要求定义并调用函数prime(m)判断m是否为素数,当m为素数时返回1,否则返回0。
输入-两个正整数m和n(0<=m<=n<=100)
输出-见样例
输入样例1 89 100
输出样例1
90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79
100=3+97
代码实现:
#include<stdio.h>
#include<math.h>
int prime(int m)
{
int i;
if(m<2)
return 0;
for(i=2;i<=sqrt(m);i++)
{
if(m%i == 0)
return 0;
}
return 1;
}
int main(){
int i,j,m,n,k;
scanf("%d %d",&m,&n);
if(m%2==1)
m=m+1;
if(m<6)
m=6;
k=0;
for(i=m;i<=n;i+=2)
{
for(j=2;j<i;j++){
if(prime(j)&&prime(i-j))
{
printf("%d=%d+%d",i,j,i-j);
break;
}
}
k++;
if(k%5 == 0)
printf("\n");
else
printf(", ");
}
return 0;
}
36、亲和数
古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。如果两个数相等,则认为它们不是亲和数。
编写一个函数,判断给定的两个数是否是亲和数。
输入
测试次数t
每组测试数据一行,包含两个整数A、B; 其中 0 <= A,B <= 600000 ;
输出
对于每组测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
输入样例1
3
220 284
28 28
10000 3000
输出样例1
YES
NO
NO
#include<stdio.h>
int main()
{
int t,A,B;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&A,&B);
int i,sum1=0,sum2=0;
for(i=1;i<A/2+1;i++)
{
if(A%i==0)
sum1+=i;
}
for(i=1;i<B/2+1;i++)
{
if(B%i==0)
sum2+=i;
}
if(sum1==B&&sum2==A&&A!=B)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
37、欧拉函数
在数论中,欧拉函数f(n)被定义为:小于等于n的正整数中和n互质的数的数目(互质即两者最大公约数为1)
如f(1)=1,因为与小于等于1的数中与1互质的数只有1
再如f(8)=4,因为小于等于8中的数与8互质的数有1,3,5,7,而2与8最大公约数为2,4与8最大公约数为4,6与8最大公约数为2
现在给定一个数n,求f(n)的值
要求定义并调用函数f(n),返回欧拉函数的值
输入 测试样例有多组,第一行输入一个整数T,代表测试组数
接下来的每一行输入一个整数n,代表需要计算f(n)的n
输出 对于每组测试样例,各输出一行,其中包括一个整数f(n)
输入样例1
3
1
4
8
输出样例1
1
2
4
#include<stdio.h>
#include<math.h>
int gcd(int a,int b)
{
int N;
N=a%b;
while(N){
a=b;
b=N;
N=a%b;
}
return b;
}
int f(int X)
{
int i=0,j=0;
for (j=1;j<=X;j++)
if(gcd(j,X)==1)
{
i++;
}
return i;
}
int main()
{
int m,n;
scanf("%d",&m);
for (int i=0; i<m;i++)
{
scanf("%d",&n);
printf("%d\n",f(n));
}
}
38、空心的数字金字塔
题目描述
本题要求实现一个函数,输入一个正整数n(1<=n<=9),输出n行空心的数字金字塔。要求定义和调用函数hollow_pyramid(n)打印出n行空心的数字金字塔。
输入
正整数n(1<=n<=9)
输出
输入样例1 <-复制
5
输出样例1
1
2 2
3 3
4 4
555555555
代码实现:
#include<stdio.h>
void hollowPyramid(int n);
int main()
{
int n;
scanf("%d",&n);
hollowPyramid(n);
return 0;
}
void hollowPyramid(int n)
{
int a,b,c,d;
for(a=1;a<=n;a++){
for(b=n-a;b>0;b--){
printf(" ");
}
printf("%d",a);
if(a==1)
printf("\n");
if(a>=2&&a<n)
{
for(c=0;c<2*a-3;c++)
{
printf(" ");
}
printf("%d\n",a);
}
}
a=a-1;
if(a==n)
{
for(d=0;d<2*n-2;d++)
{
printf("%d",a);
}
}
return 0;
}
39、使用函数统计指定数字的个数
题目描述
本题要求实现一个统计整数中指定数字的个数的简单函数:输入两个整数number和digit(0<=digit<=9),统计并输出整数number中数字digit的个数。
要求定义并调用函数countdigit(number,digit),它的功能是统计整数number中数字digit的个数。例如countdigit(10090,0)的返回值是3。
输入
两个整数number和digit(0<=digit<=9)
输出
见样例
输入样例1 <-复制
-21252 2
输出样例1
Number of digit 2 in -21252: 3
代码实现:
#include<stdio.h>
int countdigit(int number,int digit);
int main()
{
int number,digit;
scanf("%d%d",&number,&digit);
printf("Number of digit %d in %d: %d",digit,number,countdigit(number,digit));
return 0;
}
int countdigit(int number,int digit)
{
int n=0;
if(number<0)
number=-number;
do
{
if(number%10==digit){
n++;
}
number=number/10;
}
while(number%10!=0);
return n;
}
40、使用函数输出指定范围内的 Fibonacci数
题目描述
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
要求定义并调用函数fib(n),它的功能是返回第n
项Fibonacci数。例如fib(7)返回值是13。定义并调用函数print_fn(m,n)输出给定范围[m
,n
]内的所有Fibonacci数,相邻数字间有一个空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。
输入
两正整数m和n(0<m≤n≤10000)
输出
见样例
输入样例1 <-复制
20 100
输出样例1
21 34 55 89
代码:
#include<stdio.h>
void PrintFN(int m,int n);
int fib(int n);
int main()
{
int m,n,t;
scanf("%d %d", &m,&n);
PrintFN(m, n);
return 0;
}
int fib(int n)
{
int a=1,b=1,s=0,q;
if(n==1)
return 1;
else if(n==2)
return 1;
else
{
n=n-2;
while(n--)
{
s=a+b;
q=b;
b=s;
a=q;
}
}
return s;
}
void PrintFN(int m,int n)
{
int x=1,y,time=0;
for(y=fib(x);y<=n;x++)
{
y=fib(x);
if(y<=n&&y>=m)
{
time++;
if(time==1)
printf("%d",y);
else
printf(" %d",y);
}
}
if(time==0)
puts("No Fibonacci number");
}
41、勤奋的大佬(循环)
题目描述
大佬每天都会到软工的实验室(7楼)学习,一天去三次。软工有两部电梯,其中有一部电梯每隔x天维修一次,(维修期间,电梯一整天都不工作),另一部电梯每隔y天维修一次,如果同一天两部楼梯都在维修期间,大佬只能爬楼梯,他想知道从第1天到第n天一共走了多少层楼梯?(设第0天两部电梯都在维修)
输入
第一行包含t组测试数据(t<=150) 每组测试输入3个数字x,y,n(0<=x<=1000 , 0<=y<=1000 , n<=1e9)
输出
输出走了多少层楼梯。
输入样例1 <-复制
2
1 1 2
2 3 6
输出样例1
36
0
代码实现:
#include<stdio.h>
int main()
{
int x,y,n,t,a,b,i,j,k,count=0;
scanf("%d",&t);
for(j=1;j<=t;j++){
scanf("%d%d%d",&x,&y,&n);
for(i=1;i<=n;i++)
{
a=i%x;
b=i%y;
if(a==0&&b==0)
count++;
}
k=(count-1)*36;
printf("%d\n",k);
count=0;
}
return 0;
}
42、字符合并
题目描述
给定一串字符序列(以#结束),按照单词将字符合并。合并后每个大写字母前有一个空格,第一个字符前没有空格,最后一个字符后没有空格。请输出包含不超过N个合并后字符的序列
注意:如果N大于合并后(包括两个单词之间保留的空格)的字符个数,则输出完整的字符序列,否则只输出N个合并后的字符就停止
输入
输出一个正整数N
输入字符数据,并保证在#之前不会出现换行符\n
输出
最多输出N个合并后的字符序列
输入样例1 <-复制
15
H o wA r e Y o u #
输出样例1
How Are You
代码实现:
#include<stdio.h>
int main(){
int N,m=1;
char arr1;
char arr2;
char arr3;
char arr4;
char arr5;
char ch;
scanf("%d",&N);
while (N>0 && ch!='#')
{
ch=getchar();
if(m==1&&(ch>='A')&&(ch<='Z'))
putchar(ch);
else if((ch>='A')&&(ch<='Z'))
{
putchar(' ');
N--;
putchar(ch);
}
else if((ch>='a')&&(ch<='z'))
putchar(ch);
else if(N==0)
break;
else
continue;
N--;
m++;
}
return 0;
}
43、简化的插入排序
题目描述
本题要求编写程序,将一个给定的整数插到原本有序的整数序列中,使结果序列仍然有序。
输入
输入在第一行先给出非负整数N(<=10);第二行给出N个从小到大排好顺序的整数;第三行给出一个整数X。
输出
在一行内输出将X插入后仍然从小到大有序的整数序列,每个数字后面有一个空格。
输入样例1 <-复制
5
1 2 4 5 7
3
输出样例1
1 2 3 4 5 7
#include <stdio.h>
int main()
{
int N,X,i,j;
scanf("%d",&N);
int a[N+1];
for(i=0;i<N;i++)
scanf("%d",&a[i]);
scanf("%d",&X);
for(i=0;i<N;i++)
if(a[i]>X)
break;
for(j=N-1;j>=i;j--)
a[j+1]=a[j];
a[i]=X;
for(i=0;i<N+1;i++)
printf("%d ",a[i]);
return 0;
}
C++版本:
#include<iostream>
using namespace std;
int main() {
int numberl[11] = { 1,2,3,4,5,6,7,8,9,11 };
int N, temp;
cout << "请输入你要插入的数字:" << endl;
cin >> N;
//第一步查找位置
for (int i = 0; i < 10; i++) {
//1如果N是介于数组中两个数的中间,则i+1就是m放入数组对应的位置
if (N > numberl[i] && N < numberl[i + 1]) {//1
temp = i + 1;//2
break;
}
}
//从temp开始到number[],倒叙逐个将数组元素向后移动1位
for (int i = 10; i >= temp; i--) {
numberl[i + 1] = numberl[i];
}
numberl[temp] = N;//将N放入数组索引temp处
cout << "插入后的数组为:";
for (int i = 0; i <= 10; i++) {
cout << numberl[i] << " ";
}
}
44、交换最小值和最大值
题目描述
本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。
注意:题目保证最大和最小值都是唯一的。
输入
输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。
输出
在一行中顺序输出交换后的序列,每个整数后跟一个空格。
输入样例1 <-复制
5
8 2 5 1 4
输出样例1
1 2 5 4 8
#include <stdio.h>
int main()
{
int N,i,m;
scanf("%d",&N);
int a[N];
for(i=0;i<N;i++)
scanf("%d",&a[i]);
int min,max;
min=a[0];
for(i=1;i<N;i++)
if(a[i]<min)
{
min = a[i];
m=i;
}
a[m]=a[0];
a[0]=min;
max=a[0];
for(i=1;i<N;i++)
if(a[i]>max)
{
max = a[i];
m=i;
}
a[m]=a[N-1];
a[N-1]=max;
for(i=0;i<N;i++)
printf("%d ",a[i]);
}
45、求一批整数中出现最多的各位数字
题目描述
给定一批整数,分析每个整数的每一位数字,求出现次数最多的各位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。
输入
输入在第1行中给出正整数N(1≤N≤1000),在第二行中给出N个不超过整型范围的非负整数,数字间以空格分隔。
输出
在一行中按格式“M: n1 n2 ...”输出,其中M是最大次数,n1、n2、……为出现次数最多的各位数字,按从小到大的顺序排列。数字间以空格分隔,但末尾不得有多余空格。
输入样例1 <-复制
3
1234 2345 3456
输出样例1
3: 3 4
代码实现:
#include <stdio.h>
int main()
{
int a[10]={0};
int k,m,n,N,q,max;
max=0;
scanf("%d",&N);
for(m=0;m<N;m++)
{
scanf("%d",&q);
if(q==0)
{
a[0]+=1;
}
for(;q>0;)
{
n=q%10;
for(k=0;k<10;k++)
{
if(n==k)
{
a[k]+=1;
}
}
q=q/10;
}
}
for(m=0;m<10;m++)
{
if(a[m]>=max)
max=a[m];
}
printf("%d:",max);
for(m=0;m<10;m++)
{
if(a[m]==max)
{
printf(" %d",m);
}
}
return 0;
}
46、找出不是两个数组共有的元素
题目描述
给定两个整型数组,本题要求找出不是两者共有的元素。
输入
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
输入样例1 <-复制
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
输出样例1
3 5 -15 6 4 1
代码实现:
#include<stdio.h>
int main(){
int a[21],b[21],c[21];
int N,M,i,j,t=0,n=0;
scanf("%d",&N);
for(i=0;i<N;i++)
scanf("%d",&a[i]);
scanf("%d",&M);
for(i=0;i<M;i++)
scanf("%d",&b[i]);
for(i=0;i<N;i++){
for(j=0;j<M;j++)
if(a[i]==b[j])break;
if(j==M){
c[n]=a[i];
n++;
}
}
for(i=0;i<M;i++){
for(j=0;j<N;j++)
if(b[i]==a[j])
break;
if(j==N){
c[n]=b[i];
n++;
}
}
for(i=0;i<n;i++){
for(j=0;j<i;j++)
if(c[i]==c[j])break;
if(j==i){
if(t!=0)printf(" ");
printf("%d",c[i]);
t++;
}
}
return 0;
}
47、求整数序列中出现次数最多的数
题目描述
本题要求统计一个整型序列中出现次数最多的整数及其出现次数。
输入
输入在一行中给出序列中整数个数N(0<N≤1000),以及N个整数。数字间以空格分隔。
输出
在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔。题目保证这样的数字是唯一的。
输入样例1 <-复制\
10 3 2 -1 5 3 4 3 0 3 2
输出样例1
3 4
代码实现:
#include <stdio.h>
int main()
{
int N,a[1000],b[1000];
scanf("%d",&N);
for(int m=0;m<N;m++)
{
scanf("%d",&a[m]);
b[m]=0;
}
for(int m=0;m<N;m++)
{
for(int n=0;n<N;n++)
{
if(a[m]==a[n])
b[m]++;
}
}
int max=b[0],t=0;
for(int m=1;m<N;m++)
{
if(b[m]>max)
{
max=b[m];
t=m;
}
}
max=b[t];
printf("%d %d",a[t],max);
return 0;
}
48、组个最小数
题目描述
给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。
现给定数字,请编写程序输出能够组成的最小的数。
输入
输入在一行中给出10个非负整数,顺序表示我们拥有数字0、数字1、……数字9的个数。整数间用一个空格分隔。10个数字的总个数不超过50,且至少拥有1个非0的数字。
输出
在一行中输出能够组成的最小的数。
输入样例1 <-复制
2 2 0 0 0 3 0 0 1 0
输出样例1
10015558
#include<stdio.h>
int main()
{
int m,n;
int s[15];
for(m=0;m<10;m++)
scanf("%d",&s[m]);
for(m=1;m<10;m++)
{
if(s[m]!=0)
{
printf("%d",m);
s[m]--;
break;
}
}
for(m=0;m<10;m++)
{
for(n=s[m];n>0;n--)
{
if(s[m]!=0)
printf("%d",m);
}
}
return 0;
}
49、判断上三角矩阵
题目描述
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
输出
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
输入样例1 <-复制
2
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
输出样例1
YES
NO
代码实现:
#include <stdio.h>
int main()
{
int T,n,i,b,q;
scanf("%d",&T);
for(q=0;q<T;q++)
{
int w=0;
scanf("%d",&n);
int a[16][16];
for(i=0;i<n;i++)
{
for(b=0;b<n;b++)
scanf("%d",&a[i][b]);
}
for(i=0;i<n;i++)
{
for(b=0;b<i;b++)
{
if(a[i][b]!=0)
{
w=1;
break;
}
}
}
if(w==1)
printf("NO\n");
if(w==0)
printf("YES\n");
}
return 0;
}
50、打印杨辉三角
题目描述
本题要求按照规定格式打印前N行杨辉三角。
输入
输入在一行中给出N(1≤N≤10)。
输出
以正三角形的格式输出前N行杨辉三角。每个数字占固定4位。
输入样例1 <-复制 6
输出样例1
1\n
1 1\n
1 2 1\n
1 3 3 1\n
1 4 6 4 1\n
1 5 10 10 5 1
#include<stdio.h>
int main(){
int N;
scanf("%d",&N);
int a[N][N];
for(int i=0; i<N; i++){
a[i][0]=1;
a[i][i]=1;
}
for(int j=2; j<N; j++){
for(int b=1; b<j; b++){
a[j][b]=a[j-1][b-1]+a[j-1][b];
}
}
int k=N;
for(int i=0; i<N; i++){
int b=k-1;
while(b>0){
printf(" ");
b--;
}
for(int j=0; j<=i; j++){
int z=a[i][j];
int n=0;
while(z!=0){
z/=10;
n++;
}
for(int l=0; l<4-n; l++) printf(" ");
printf("%d",a[i][j]);
}
if(i!=N-1) printf("\n");
k--;
}
return 0;
}
51、方阵循环右移
题目描述
本题要求编写程序,将给定n×n方阵中的每个元素循环在该行内右移m个位置。
输入
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例1 <-复制
2 3
1 2 3
4 5 6
7 8 9
输出样例1
2 3 1
5 6 4
8 9 7
代码实现:
#include<stdio.h>
int main()
{
int a[6][6],b[6][6];
int i,j;
int m,n;
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
m=m%n;
if(m==0){
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d",a[i][j]);
if(i<n-1)
printf("\n");
}
}
else{
while(m--){
for(i=0;i<n;i++)
b[i][1]=a[i][2];
for(i=0;i<n;i++)
b[i][0]=a[i][n-2];
for(i=0;i<n;i++)
b[i][2]=a[i][0];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
b[i][j]=b[i][j];
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d ",b[i][j]);
if(i < n-1)
printf("\n");
}
}
}
52、找鞍点
题目描述
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。
输入
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。
输出
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。
输入样例1 <-复制
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例1 2 1
#include<stdio.h>
int main()
{
int n,i,j;
scanf("%d",&n);
int a[n][n];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
}
int r=0,l=0,f=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]>=a[i][l])
{
l=j;
}
}
f=1;
for(r=0;r<n;r++)
{
if(a[r][l]<a[i][l])
{
f=0;
break;
}
}
if(f)
{
break;
}
}
if(f)
printf("%d %d",i,l);
else
printf("NONE");
}
53、螺旋方阵
题目描述
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入
输入在一行中给出一个正整数N(<10)。
输出
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例1 <-复制 5
输出样例1
1 2 3 4 5\n
16 17 18 19 6\n
15 24 25 20 7\n
14 23 22 21 8\n
13 12 11 10 9
代码实现:
#include<stdio.h>
int main(){
int n,m,i=0,c=0;
scanf("%d",&n);
int l=0,s=n-1;
int a[n][n];
while(l<=s){
for(m=l;m<=s;m++)
a[l][m]=++c;
for(i=l+1;i<=s;i++)
a[i][s]=++c;
for(m=s-1;m>=l;m--)
a[s][m]=++c;
for(i=s-1;i>l;i--)
a[i][l]=++c;
l++;
s--;
}
for(i=0;i<n;i++){
for(m=0;m<n;m++)
printf("%3d",a[i][m]);
printf("\n");
}}
54、简易连连看
题目描述
本题要求实现一个简易连连看游戏模拟程序。
给定一个2n*2n的方阵网格游戏盘面,每个格子中放置一些符号。这些符号一定是成对出现的,同一个符号可能不止一对。程序读入玩家给出的一对位置(x1,y1)、(x2,y2),判断这两个位置上的符号是否匹配。如果匹配成功,则将两个符号消为“*”并输出消去后的盘面;否则输出“Uh-oh”。若匹配错误达到3次,则输出“Game Over”并结束游戏。或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏。
输入
输入在一行中给一个正整数N(<5)。随后2N行,每行2N个大写英文字母(其间以1个空格分隔),表示游戏盘面。盘面之后给出一个正整数K,随后K行,每行按照格式“x1y1x2y2”给出一个玩家的输入。注意格子的行、列编号是从1到2N。
输出
根据玩家的每一步输入,输出相应的结果。输出盘面时注意,每行字符间以1个空格分隔,行末不得有多余空格。
输入样例1 <-复制
2
I T I T
Y T I A
T A T Y
I K K T
11
1 1 1 3
4 2 4 3
3 1 4 2
2 2 1 2
3 1 2 4
4 4 3 1
2 1 3 4
3 3 1 4
4 1 2 3
2 4 3 2
1 1 2 2
输出样例1
* T * T
Y T I A
T A T Y
I K K T
* T * T
Y T I A
T A T Y
I * * T
Uh-oh
* * * T
Y * I A
T A T Y
I * * T
Uh-oh
* * * T
Y * I A
* A T Y
I * * *
* * * T
* * I A
* A T *
I * * *
* * * *
* * I A
* A * *
I * * *
* * * *
* * * A
* A * *
* * * *
Congratulations!
代码实现:
#include<stdio.h>
int main(void)
{
char ch[10][10];
int m,n,s,N,a,b,g,k,flag=1,h,c1=0,c2=0;
scanf("%d",&N);
getchar();
for(a=1;a<=2*N;a++)
for(b=1;b<=2*N;b++){
ch[a][b]=getchar();
getchar();
}
scanf("%d",&s);
for(a=0;a<s;a++){
scanf("%d%d%d%d",&m,&n,&g,&k);
if(ch[m][n]==ch[g][k]&&ch[m][n]!='*'){
ch[m][n]='*';
ch[g][k]='*';
flag=0;
}
if(!flag)
for(b=1;b<=2*N;b++)
for(h=1;h<=2*N;h++){
printf("%c",ch[b][h]);
if(h==2*N)
printf("\n");
else printf(" ");
}
else{
printf("Uh-oh\n");c1++;
}
if(c1>=3){
printf("Game Over\n");
break;
}
for(b=1;b<=2*N;b++)
for(h=1;h<=2*N;h++){
if(ch[b][h]!='*')
c2++;
}
if(c2==2){
printf("Congratulations!\n");
break;
}
flag=1;
c2=0;
}
return 0;
}