Ural 1780
题意:
输入一个二进制数与该二进制数的格雷码,但有一些位置不确定,写程序将其恢复,无法恢复输出Impossible,多解输出Ambiguity。
思路:
其实是个普通的乱搞题。。
Gray码的定义:Gi=Bi?1?Bi,G0=B0
(第i位格雷码等于第i位二进制码与第i-1位二进制码的异或值)
然后按照这个定义编码,正向反向各自编一遍,出现矛盾输出Impossible,最后还含有’?’则有多解。
代码:
/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>
using namespace std;
#define clr( x , y ) memset(x,y,sizeof(x))
#define cls( x ) memset(x,0,sizeof(x))
#define mp make_pair
#define pb push_back
typedef long long lint;
typedef long long ll;
typedef long long LL;
bool check( char &k1 , char &k0 , char &x1 ){
//cout << k1 << k0 << x1 << endl;
if( k0 == ‘?‘ ) {
if( k1 == ‘0‘ ) {
if( x1 != ‘?‘ )
k0 = x1 ;
return true ;
}
else if( k1 == ‘1‘ ) {
if( x1 != ‘?‘ )
k0 = ‘1‘ + ‘0‘ - x1 ;
return true ;
}
}
else if( k0 == ‘0‘ ){
if( k1 != x1 && k1 != ‘?‘ && x1 != ‘?‘ )
return false ;
if( k1 == ‘?‘ )
k1 = x1 ;
if( x1 == ‘?‘ )
x1 = k1 ;
return true ;
}
else {
if( k1 == x1 && k1 != ‘?‘ )
return false ;
if( k1 == ‘?‘ && x1 != ‘?‘ )
k1 = ‘1‘ + ‘0‘ - x1 ;
if( x1 == ‘?‘ && k1 != ‘?‘ )
x1 = ‘1‘ + ‘0‘ - k1 ;
return true ;
}
}
int main(){
//freopen("input.txt","r",stdin);
string x , k ;
while( cin >> k >> x ){
k = ‘0‘ + k ;
int len = x.length() ;
int flag = 0 ;
for( int i = 0 ; i < len ; i++ ){
if( !check( k[i+1] , k[i] , x[i]) ) {
cout << "Impossible" << endl;
flag = 1 ;
break ;
}
}
if( flag ) continue ;
for( int i = len - 1 ; i >= 0 ; i-- ){
if( !check( k[i+1] , k[i] , x[i] ) ) {
cout << "Impossible" << endl ;
flag = 1 ;
break ;
}
}
k.erase(0,1);
if( flag ) continue ;
if( k.find( "?" ) != string::npos || x.find( "?" ) != string::npos ){
cout << "Ambiguity" << endl;
continue ;
}
cout << k << endl ;
cout << x << endl ;
k.clear() ;
x.clear() ;
}
return 0;
}
版权声明:博主表示授权一切转载啦:)
时间: 2024-10-12 09:11:23