C语言编程问题求解答

题目描述
最近小晨在计概课上学习到二进制之后对其产生了浓厚的兴趣,在每次操作仅能移动相邻的0和1的前提下,她想知道把一个二进制数转换成另一个二进制数的最小操作数。

关于输入
输入共三行:

第一行为一个整数n (0 < n <= 200),代表二进制数的位数

第二行为第一个二进制数的每一位

第三行为第二个二进制数的每一位

关于输出
输出将第一个二进制数转换为第二个二进制数的最少操作数,如果答案不存在,则输出-1

例子输入
7
1 1 0 1 0 0 1
0 1 1 0 0 1 1
例子输出
4


#include <stdio.h>

int calc(char *ch1, char *ch2, int n)
{
    int num = 0;
    int i = 0, j = 0;
    while (i < n && j < n) {
        while (i < n && ch1[i] != '0') {
            ++i;
        }
        while (j < n && ch2[j] != '0') {
            ++j;
        }
        num += (i > j ? i - j : j - i);
        ++i;
        ++j;
    }
    while (i < n && ch1[i] != '0') ++i;
    while (j < n && ch2[j] != '0') ++j;
    if (i != j) {
        return -1;
    }
    return num;
}

int main(void)
{
    int n;
    scanf("%d", &n);
    char ch1[200] = {0};
    char ch2[200] = {0};
    scanf("%s", ch1);
    scanf("%s", ch2);
    printf("%d\n", calc(ch1, ch2, n));
    return 0;
}

有用请采纳

#include<stdio.h>
#include<math.h>
/*
使得每一个零或者一归位最少的移动次数应该是, 在移动时保证路线不重叠
考虑向一个方向交换, 即只向后面进行交换操作 
*/
int main(){
    int n; // 位数 
    int count1_1, count2_1; // 统计两个数组中1的个数
    count1_1 = 0; count2_1 = 0;
    int count = 0; // 统计总的需要移动的位数 
    
    scanf("%d", &n);
    int nums1[n], nums2[n];
    for (int i = 0; i < n; i++){
        scanf("%d", &nums1[i]);
        if (nums1[i] == 1)
            count1_1++;
    }
    
    for (int i = 0; i < n; i++){
        scanf("%d", &nums2[i]);
        if (nums2[i] == 1)
            count2_1++;
    }
    
    if(count1_1 != count2_1)
        printf("-1");

    
    else{
        int i, j;
        i = 0; j = 0;
        
        while (i < n){
            if (nums1[i] == 1)
                i++;
            
            else{
                while(j < n && nums2[j] == 1)   // 找到第一个为0的地方
                    j += 1;
                
                count += abs(j - i);
                j += 1; 
                i += 1;
            }
        }
    }
    
    printf("%d\n", count);
    
}