题目大意:
给出
k
个
分析:
假设我们将
Si
与
P
的交定义为
枚举
P
当前的格子
AC code:
#include <cstdio>
#include <cstring>
#include <map>
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int MAXK = 7;
const int MAXN = 11;
const int MAXS = 46660;
const int INF = 0x3f;
int n, m, k, s;
int g[MAXK][MAXN][MAXN];
int col[MAXN][MAXN];
int f[MAXS], fr[MAXS], fx[MAXS], fy[MAXS];
map<pii, int> S;
int ans[MAXN][MAXN];
void upd(int s, int x, int y)
{
int ts = s, add = f[s], tot = 0, ns = 0;
pii sta[MAXK];S.clear();
for(int i = 0, j = 1; i < k; ++i, ts /= k, j *= k)
{
sta[i] = mp(ts%k, g[i][x][y]);
if(!S.count(sta[i])) S[sta[i]] = tot++;
ns += S[sta[i]]*j;
}
if(f[ns] > add+1)
{
f[ns] = add+1, fr[ns] = s;
fx[ns] = x, fy[ns] = y;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < k; ++i)
for(int p = 0; p < n; ++p)
for(int q = 0; q < m; ++q)
{
scanf("%1d", &g[i][p][q]);
col[p][q] |= g[i][p][q];
}
s = 1;
for(int i = 0; i < k; ++i) s *= k;
memset(f, INF, sizeof f);
f[0] = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j)
if(col[i][j])
for(int p = 0; p < s; ++p)
if(f[p] < INF)
upd(p, i, j);
int end = 0;
for(int i = k-1; i >= 0; --i)
end = end*k+i;
printf("%d\n", f[end]);
int now = end;
while(now)
{
ans[fx[now]][fy[now]] = 1;
now = fr[now];
}
for(int i = 0; i < n; ++i)
{
for(int j = 0; j < m; ++j)
printf("%d", ans[i][j]);
puts("");
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return 0;
}