题目描述
最近小晨在计概课上学习到二进制之后对其产生了浓厚的兴趣,在每次操作仅能移动相邻的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;
}