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 main()
{
    int n = 0;
    int a[200] = { 0 };
    int b[200] = { 0 };
int a0=0;
int b0=0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
if (a[i] == 0)a0++;
    }
    for (int i = 0; i < n; i++) {
        scanf("%d", &b[i]);
if(b[i]==0)b0++;
    }
    int cnt = 0;
if(a0!=b0)printf("-1");
else{
    for (int i = 0; i < n; i++) {
        if(a[i]!=b[i]){
            for (int j = i + 1; j < n; j++) {
                if (a[j] == b[i]) {
                    for (int p = j-1; p >= i; p--) {
                        int temp = 0;
                        temp = a[p];
                        a[p] = a[p + 1];
                        a[p + 1] = temp;
                        cnt++;
                    }
                
                    break;
                }
                        
            }
        } 

    }
    
    printf("%d", cnt);
}
    
        return 0;
}

参考 https://blog.csdn.net/xuyang0905/article/details/109740482


#include <stdio.h>

int main()
{
    int n = 0;
    int a[200] = {0};
    int b[200] = {0};
    int a0 = 0;
    int b0 = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        if (a[i] == 0)
            a0++;
    }
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &b[i]);
        if (b[i] == 0)
            b0++;
    }
    int cnt = 0;
    if (a0 != b0)
        printf("-1");
    else
    {
        for (int i = 0; i < n; i++)
        {
            if (a[i] != b[i])
            {
                for (int j = i + 1; j < n; j++)
                {
                    if (a[j] == b[i])
                    {
                        for (int p = j - 1; p >= i; p--)
                        {
                            int temp = 0;
                            temp = a[p];
                            a[p] = a[p + 1];
                            a[p + 1] = temp;
                            cnt++;
                        }
                        //移动到正确的位置
                        break;
                    }
                    //寻找能移动的位
                }
            }
        }

        printf("%d", cnt);
    }

    return 0;
}