結果
| 問題 |
No.460 裏表ちわーわ
|
| コンテスト | |
| ユーザー |
rickytheta
|
| 提出日時 | 2016-12-11 01:16:10 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 9 ms / 2,000 ms |
| コード長 | 1,953 bytes |
| コンパイル時間 | 1,096 ms |
| コンパイル使用メモリ | 159,396 KB |
| 実行使用メモリ | 5,248 KB |
| 最終ジャッジ日時 | 2024-11-29 02:48:34 |
| 合計ジャッジ時間 | 1,987 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 28 |
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:78:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
78 | scanf("%d%d",&m,&n);
| ~~~~~^~~~~~~~~~~~~~
main.cpp:82:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
82 | scanf("%d",&x);
| ~~~~~^~~~~~~~~
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef int _loop_int;
#define REP(i,n) for(_loop_int i=0;i<(_loop_int)(n);++i)
#define FOR(i,a,b) for(_loop_int i=(_loop_int)(a);i<(_loop_int)(b);++i)
#define FORR(i,a,b) for(_loop_int i=(_loop_int)(b)-1;i>=(_loop_int)(a);--i)
#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define DEBUG_VEC(v) cout<<#v<<":";REP(i,v.size())cout<<" "<<v[i];cout<<endl
#define ALL(a) (a).begin(),(a).end()
#define CHMIN(a,b) a=min((a),(b))
#define CHMAX(a,b) a=max((a),(b))
// mod
const ll MOD = 1000000007ll;
#define FIX(a) ((a)%MOD+MOD)%MOD
// floating
typedef double Real;
const Real EPS = 1e-11;
#define EQ0(x) (abs(x)<EPS)
#define EQ(a,b) (abs(a-b)<EPS)
typedef complex<Real> P;
int m,n;
typedef bitset<64> bit;
#define ID(i,j) ((i)*n+(j))
void flip(bit &a,int y,int x){
FOR(dy,-1,2)FOR(dx,-1,2){
int ny=y+dy;
int nx=x+dx;
if(ny>=0 && nx>=0 && ny<m && nx<n){
if(a[ID(ny,nx)])a.reset(ID(ny,nx));
else a.set(ID(ny,nx));
}
}
}
int dfs(bit a,int dan){
if(dan==m){
if(a.count()==0){
return 0;
}else{
return 1252525252;
}
}
// first flip
int bcnt = 1;
bit b = a;
flip(b,dan,0);
FOR(i,1,n)if(b[ID(dan-1,i-1)]){
flip(b,dan,i);
bcnt++;
}
// not flip
int ccnt = 0;
bit c = a;
FOR(i,1,n)if(c[ID(dan-1,i-1)]){
flip(c,dan,i);
ccnt++;
}
return min(dfs(b,dan+1)+bcnt,dfs(c,dan+1)+ccnt);
}
int main(){
scanf("%d%d",&m,&n);
bit origin;
REP(i,m)REP(j,n){
int x;
scanf("%d",&x);
if(x==1)origin.set(ID(i,j));
}
int mn = 830252521;
REP(msk,1<<n){
int ans = 0;
bit a = origin;
REP(i,n)if((msk>>i)&1){
ans++;
flip(a,0,i);
}
int bef = mn;
CHMIN(mn,ans+dfs(a,1));
}
if(mn>n*m){
puts("Impossible");
}else{
printf("%d\n",mn);
}
return 0;
}
rickytheta