社区讨论
求救
P8549 小挖的核燃料填充参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo7xwssg
- 此快照首次捕获于
- 2023/10/27 09:34 2 年前
- 此快照最后确认于
- 2023/10/27 09:34 2 年前
CPP
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100;
int f[N][N], ans[N * N], ans1[N * N], cn[N];
char t[N][N];
int n, m, cnt, ansx = 0x7fffffff, ansx1[N * N], ansx2[N * N];
bool ppp = 0;
bool check()
{
int flag[N];
for (int i = 1; i <= m; i ++ )
{
memset(flag, 0, sizeof flag);
for (int j = 1; j <= m; j ++ )
{
if(flag[f[i][j]] == 1) return 0;
flag[f[i][j]] = 1;
}
for (int j = 0; j < m; j ++ )
{
if(flag[j] != 1)
{
return 0;
}
}
}
for (int i = 1; i <= m; i ++ )
{
memset(flag, 0, sizeof flag);
for (int j = 1; j <= m; j ++ )
{
if(flag[f[j][i]] == 1) return 0;
flag[f[j][i]] = 1;
}
for (int j = 0; j < m; j ++ )
{
if(flag[j] != 1)
{
return 0;
}
}
}
int k = 0, k1 = 0;
for (int p = 0; p < n * n; p ++ )
{
memset(flag, 0, sizeof flag);
k = (p / n) * n + 1;
k1 = (p % n) * n + 1;
if(k == 0)
{
k = 1;
}
if(k1 == 0)
{
k1 = 1;
}
for (int i = k; i <= k + n - 1; i ++ )
{
for (int j = k1; j <= k1 + n - 1; j ++ )
{
if(flag[f[i][j]] == 1) return 0;
flag[f[i][j]] = 1;
}
}
for (int i = 0; i < m; i ++ )
{
if(flag[i] != 1)
{
return 0;
}
}
}
return 1;
}
void turn(int x, int y, int q)
{
if(x == 0) x = 1;
else
{
x *= n, x += 1;
}
if(y == 0) y = 1;
else
{
y *= n, y += 1;
}
int u[N][N];
if(q == 0)
{
for (int i = x; i <= x + n - 1; i ++ )
{
for (int j = y; j <= y + n - 1; j ++ )
{
u[i][j] = f[i][j];
}
}
for (int i = x, g = y; i <= x + n - 1; i ++ ,g ++ )
{
for (int j = y, g1 = x + n - 1; j <= y + n - 1; j ++ ,g1 -- )
{
f[g1][g] = u[i][j];
}
}
}
else
{
for (int i = x; i <= x + n - 1; i ++ )
{
for (int j = y; j <= y + n - 1; j ++ )
{
u[i][j] = f[i][j];
}
}
for (int i = x, g = y + n - 1; i <= x + n - 1; i ++ ,g -- )
{
for (int j = y, g1 = x; j <= y + n - 1; j ++ ,g1 ++ )
{
f[g1][g] = u[i][j];
}
}
}
}
void dfs(int u)
{
if(u < ansx)
{
if(check())
{
ansx = u;
for (int i = 1; i <= ansx; i ++ )
{
ansx1[i] = ans[i];
ansx2[i] = ans1[i];
}
return;
}
}
else if(u >= ansx)
{
return;
}
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= n; j ++ )
{
int yy = (i - 1) * n + j - 1;
if(cn[yy])
{
continue;
}
else
{
cn[yy] = 1;
}
for (int k = 1; k <= 3; k ++ )
{
for (int l = 1; l <= k; l ++ )
{
ans[cnt + l] = i;
ans1[cnt + l] = j;
turn(i - 1, j - 1, 0);
}
cnt += k;
dfs(u + k);
cnt -= k;
//if(ppp) return;
for (int l = 1; l <= k; l ++ )
{
turn(i - 1, j - 1, 1);
}
}
cn[yy] = 0;
}
}
return;
}
int main()
{
cin >> n;
m = n * n;
for (int i = 1; i <= m; i ++ )
{
cin >> t[i] + 1;
}
for (int i = 1; i <= m; i ++ )
{
for (int j = 1; j <= m; j ++ )
{
if(t[i][j] >= '0' && t[i][j] <= '9')
f[i][j] = t[i][j] - '0';
else
f[i][j] = t[i][j] - 'A' + 10;
}
}
/*
turn(0, 0, 0);
turn(0, 1, 0);
turn(0 ,1, 0);
turn(1, 0, 0);
turn(1, 0, 0);
turn(1, 1, 0);
turn(1, 1, 0);
for (int i = 1; i <= m; i ++ )
{
for (int j = 1; j <= m; j ++ )
{
cout << f[i][j] << " ";
}
cout << endl;
}
*/
dfs(0);
if(ansx == 0x7fffffff)
{
cout << "-1";
return 0;
}
cout << ansx << endl;
for (int i = 1; i <= ansx; i ++ )
{
cout << ansx1[i] << ' ' << ansx2[i] << endl;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...