#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("guess.in");ofstream fout("guess.out");
int len=5,a[100]={2,3,1},sss[100]={0},m,n,nnn=0,mmm=0,front=1,rail=1,queue[2][1000]={0},sum,now=0,stop;
long white_answer=0,black_answer=0;//black_answer 中0为黑子 , white_answer 中1为白子
long white_sure=0,black_sure=0;// black_sure 中1为黑子 , white_sure 中0为白子
char map[100][100]={'u'};
void init(){sss[a[0]+1]=-1;for (int i=a[0];i>=1;i--){sss[i]=sss[i+1]+a[i]+1;}}
long fill(long ss,int j,int l)
{long temp=0;
for (int i=1;i<=l;i++)
{temp=temp*2+1;}
temp=temp<<(len-j+1-l);
return ss|temp;
}
int state[2][100][100]={0};
void dfs(long s,int j,int k)
{
int temp=len-j+1;
if (temp<0)temp=0;
if (((s>>(temp))&(black_sure>>(temp)))!=(black_sure>>(temp)))return;
if (((s>>(temp))|(white_sure>>(temp)))!=(white_sure>>(temp)))return;
if (k>a[0]){black_answer=s|black_answer;white_answer=white_answer&s;return;}
for (int i=j;i<=len-sss[k]+1;i++)
dfs(fill(s,i,a[k]),i+1+a[k],k+1);
}
void search(int flag,int line)
{
white_sure=0,black_sure=0;white_answer=0;
if (flag==0)
{
len=m;white_answer=mmm;
for(int i=1;i<=m;i++)
{
if (map[i][line]=='b')black_sure=(black_sure*2)+1;else black_sure=black_sure*2;
if (map[i][line]=='w')white_sure=white_sure*2;else white_sure=white_sure*2+1;
}
}
else
{
len=n;white_answer=nnn;
for(int i=1;i<=n;i++)
{
if (map[line][i]=='b')black_sure=(black_sure*2)+1;else black_sure=black_sure*2;
if (map[line][i]=='w')white_sure=white_sure*2;else white_sure=white_sure*2+1;
}
}
memset(a,0,sizeof(a)); a[0]=state[flag][line][0];
for(int i=1;i<=state[flag][line][0];i++)a[i]=state[flag][line][i];
black_answer=0;init();dfs(0,1,1);
if (flag==0)
{
for (i=m;i>=1;i--)
{
if (((black_answer & 1)==0)&&(map[i][line]==0)){map[i][line]='w';queue[0][rail]=1;queue[1][rail]=i;rail++;}
if (((white_answer & 1)==1)&&(map[i][line]==0)){map[i][line]='b';queue[0][rail]=1;queue[1][rail]=i;rail++;now++;}
black_answer=black_answer>>1;
white_answer=white_answer>>1;
}
}
else
{
for (i=n;i>=1;i--)
{
if (((black_answer & 1)==0)&&(map[line][i]==0)){map[line][i]='w';queue[0][rail]=0;queue[1][rail]=i;rail++;}
if (((white_answer & 1)==1)&&(map[line][i]==0)){map[line][i]='b';queue[0][rail]=0;queue[1][rail]=i;rail++;now++;}
black_answer=black_answer>>1;white_answer=white_answer>>1;
}
}
}
main()
{
fin>>m>>n;
for (int i=1;i<=n;i++)nnn=nnn*2+1;
for ( i=1;i<=m;i++)mmm=mmm*2+1;
for ( i=1;i<=m;i++)
{
fin>>state[1][i][0];
for(int j=1;j<=state[1][i][0];j++)fin>>state[1][i][j];
}
for (i=1;i<=n;i++)
{
fin>>state[0][i][0];
for(int j=1;j<=state[0][i][0];j++)fin>>state[0][i][j];
}
fin>>sum;
for(i=1;i<=m;i++){queue[0][rail]=1;queue[1][rail]=i;rail++;}//入队
for(i=1;i<=n;i++){queue[0][rail]=0;queue[1][rail]=i;rail++;}
while ((front!=rail)&&(now<=sum))
{
search(queue[0][front],queue[1][front]);
front++;//出队
}
for (i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
if(map[j][i]==0) fout<<' ';
else fout<<map[j][i];
}
fout<<endl;
}
return 0;
}
完美去bug版
