bug运输[辽宁2014年省队互测一]

奇奇怪怪的题目,不知道他要我们干什么。

我们观察一波局势,发现答案最大不过5.因为如果答案是6或以上的话,我们就至少要2^(5*5)个5*5的方格。

仔细计算一波时间复杂度,再信仰一波,坚信暴力压正解。

#include<bits/stdc++.h>
#define sight(c) ('0'<=c&&c<='9')
#define N 1007
#define X(x) x<<=1,x|=a[j+ii][k+jj]
#define Y(x) x<<=1,x|=a[j+jj][k+ii]
#define MARICLE __attribute__((optimize("-O3")))
#define O(x) f[x]?(x=0):(f[x]=1,ans++,x=0);
MARICLE inline void read(int &x){
    static char c;
    for (c=getchar();!sight(c);c=getchar());
    for (x=0;sight(c);c=getchar())x=x*10+c-48;
}
MARICLE inline void reads(bool &x){
    static char c;
    for (c=getchar();!sight(c);c=getchar()); x=(int)c-48;
}
using namespace std;
MARICLE void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);}
MARICLE inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('
'); }
int n,ag,op,ans,ap,ot;
bool a[N][N],k[2],f[(1<<25)+7];
MARICLE void writeLn(int x,int len){
    for (int i=len-1;~i;i--) {
     for (int j=len-1;~j;j--)
      putchar('0'+(x>>i*len+j&1));putchar('
');}
}
MARICLE int main () {
//  freopen("a.in","r",stdin);
    read(n);
    for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) reads(a[i][j]),k[a[i][j]]=1;
    if (!k[0]) {writeln(1);writeln(0);return 0;}
    if (!k[1]) {writeln(1);writeln(1);return 0;}
    for (int i=2;i<=5;i++) {
      memset(f,0,sizeof f);ans=0;
      for (int j=n-i+1;j;j--)
        for (int k=n-i+1;k;k--) {
           for (int ii=0;ii<i;ii++) for (int jj=0;jj<i;jj++) X(ag),Y(ap); 
            O(ag);O(ap);
           for (int ii=i-1;~ii;ii--) for (int jj=0;jj<i;jj++) X(ag),Y(ap); 
            O(ag);O(ap);
           for (int ii=0;ii<i;ii++) for (int jj=i-1;~jj;jj--) X(ag),Y(ap); 
            O(ag);O(ap);
           for (int ii=i-1;~ii;ii--) for (int jj=i-1;~jj;jj--) X(ag),Y(ap); 
            O(ag);O(ap);
        }
      if (ans^(1<<i*i)) {
        ot=1<<i*i;
        for (int g=0;g<ot;g++)
         if (!f[g])  { writeln(i),writeLn(g,i); return 0;}
      } 
    }
}
原文地址:https://www.cnblogs.com/rrsb/p/8215077.html