解题思路:
注意事项:
参考代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int mid1, mid2, flag1 = 0, flag2 = 0;
void findMid(char* c, int a) {//mid表示找到‘X’的位置,flag表示有没有找到
mid1 = mid2 = flag1 = flag2 = 0;
for (int i = 0; i < a; i++) {
if (c[i] == 'X' && flag1 == 0) {
mid1 = i;
flag1 = 1;
}
else if (c[i] == 'X' && flag2 == 0) {
mid2 = i;
flag2 = 1;
}
if (flag1 == 1 && flag2 == 1)
break;
}
}
void initiate(char* c, int a) {//最开始的时候,先输出第一行,后面就可以连起来了
for (int j = 0; j < a; j++) {
c[j] = ' ';
}
c[0] = c[a - 1] = 'X';
puts(c);
}
void back(char* c, int a) {//从变换完的DNA返回为一开始的
findMid(c, a);
if (flag1 == 1 && flag2 == 0) {
mid2 = mid1;
}
c[mid1-1] = 'X';
c[mid2+1] = 'X';
c[mid1] = ' ';
c[mid2] = ' ';
puts(c);
}
void change(char* c,int a) {//变换DNA
findMid(c, a);
if ((mid1+1)==mid2||(mid1+1)==(mid2-1)) {
c[mid1 + 1] = 'X';
c[mid1] = ' ';
c[mid2] = ' ';
}
else {
c[mid1 + 1] = 'X';
c[mid2 - 1] = 'X';
c[mid1] = ' ';
c[mid2] = ' ';
}
puts(c);
}
void createDNA(char* c, int a,int b) {//生成DNA
for (int k = 0; k < b; k++) {
int flag = 0;
for (int j = 0;; j++) {
if (flag == 0) {
change(c, a);
if (mid1 + 1 == mid2 || mid1 + 1 == mid2 - 1)flag = 1;
}
if (flag == 1) {
back(c, a);
if (mid1 == 1 || mid2 == a - 2)
break;
}
}
}
}
int main()
{
int n;
scanf("%d", &n);
for (int i=0; i < n; i++) {
int a, b;
scanf("%d%d", &a, &b);
if (a == 0 || b == 0)continue;
char* c = (char*)malloc(sizeof(char) * a);
initiate(c, a);
createDNA(c, a, b);
printf("\n");
}
return 0;
}
0.0分
1 人评分
川哥的吩咐 (C++代码)浏览:1016 |
简单的a+b (C语言代码)浏览:544 |
C语言训练-排序问题<1> (C语言代码)浏览:601 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:596 |
C语言训练-数字母 (C语言代码)浏览:649 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1311 |
【绝对值排序】 (C语言代码)浏览:821 |
C语言程序设计教程(第三版)课后习题8.7 (C语言代码)浏览:916 |
C语言程序设计教程(第三版)课后习题5.5 (C语言代码)浏览:558 |
数对 (C语言代码)浏览:702 |