RT,直接爆搜然后发现过不去第四个样例。
每次爆搜的时候输出n,m发现在 214-229行的时候n,m变成了0
然鹅并没有找出问题,求条
#include <bits/stdc++.h>
#define int long long
#define debug puts("IAKIOI")
#define endl '\n'
#define inf 1e18
using namespace std;
int n,m;
struct Matrix{
int a[10][10],step;
void clear()
{
memset(a,0,sizeof(a));
step=0;
}
}beg,ed,zt[1010],new_mat;
int tot;
queue<Matrix>q;
int numh[10],numl[10];
int vis2[10];
int check(int x,int y)
{
memset(vis2,0,sizeof(vis2));
for ( int i = 1 ; i <= m ; i++ )
{
int flag=0;
for ( int j = 1 ; j <= m ; j++ )
{
if(beg.a[x][i]==ed.a[y][j]&&!vis2[j])
{
vis2[j]=1;
flag=1;
break;
}
}
if(flag==0)
{
return 0;
}
}
return 1;
}
int check2(int x,int y)
{
memset(vis2,0,sizeof(vis2));
for ( int i = 1 ; i <= n ; i++ )
{
int flag=0;
for ( int j = 1 ; j <= n ; j++ )
{
if(beg.a[i][x]==ed.a[j][y]&&!vis2[j])
{
flag=1;
vis2[j]=1;
break;
}
}
if(flag==0)
{
return 0;
}
}
return 1;
}
int check3(Matrix x)
{
for ( int k = 1 ; k <= tot ; k++ )
{
int flag=0;
for ( int i = 1 ; i <= n ; i++ )
{
for ( int j = 1 ; j <= m ; j++ )
{
if(x.a[i][j]!=zt[k].a[i][j])
{
flag=1;
break;
// return 0;
}
}
if(flag)
{
break;
}
}
if(flag==0)
{
return 1;
}
}
return 0;
}
int check4(Matrix x)
{
for ( int i = 1 ; i <= n ; i++ )
{
for ( int j = 1 ; j <= m ; j++ )
{
if(x.a[i][j]!=ed.a[i][j])
{
return 0;
}
}
}
return 1;
}
signed main()
{
cin >> n >> m;
beg.clear();
for ( int i = 1 ; i <= n ; i++ )
{
for ( int j = 1 ; j <= m ; j++ )
{
cin >> beg.a[i][j];
}
}
beg.step=0;
ed.clear();
for ( int i = 1 ; i <= n ; i++ )
{
for ( int j = 1 ; j <= m ; j++ )
{
cin >> ed.a[i][j];
}
}
for ( int i = 1 ; i <= n ; i++ )
{
int flag=0;
for ( int j = 1 ; j <= n ; j++ )
{
if(check(i,j)&&!numh[j])
{
numh[j]=i;
flag=1;
break;
}
}
if(flag==0)
{
cout << -1;
return 0;
}
}
for ( int i = 1 ; i <= m ; i++ )
{
int flag=0;
for ( int j = 1 ; j <= m ; j++ )
{
if(check2(i,j)&&!numl[j])
{
flag=1;
numl[j]=i;
break;
}
}
if(flag==0)
{
cout << -1;
return 0;
}
}
//---------------------无解-------------------
q.push(beg);
zt[++tot]=beg;
while(!q.empty())
{
Matrix fr=q.front();
q.pop();
if(check4(fr))
{
// for ( int i = 1; i <= n ; i++ )
// {
// for ( int j = 1 ; j <= m ; j++ )
// {
// cout << fr.a[i][j] << " ";
// }
// cout << endl;
// }
cout << fr.step;
return 0;
}
// for ( int i = 1 ; i <= n ; i++ )
// {
// for ( int j = 1 ; j <= m ; j++ )
// {
// cout << fr.a[i][j] << " ";
// }
// cout << endl;
// }
for ( int i = 1 ; i < n ; i++ )
{
new_mat.clear();
new_mat=fr;
new_mat.step=fr.step+1;
for ( int j = 1 ; j <= m ; j++ )
{
swap(new_mat.a[i][j],new_mat.a[i+1][j]);
}
if(check3(new_mat))
{
continue;
}
zt[++tot]=new_mat;
q.push(new_mat);
}
// for ( int i = 1 ; i <= n ; i++ )
// {
// for ( int j = 1 ; j <= m ; j++ )
// {
// cout << fr.a[i][j] << " ";
// }
// cout << endl;
// }
for ( int i = 1 ; i < m ; i++ )
{
new_mat.clear();
new_mat=fr;
new_mat.step=fr.step+1;
for ( int j = 1 ; j <= n ; j++ )
{
swap(new_mat.a[j][i],new_mat.a[j][i+1]);
}
if(check3(new_mat))
{
continue;
}
zt[++tot]=new_mat;
q.push(new_mat);
}
// for ( int i = 1 ; i <= n ; i++ )
// {
// for ( int j = 1 ; j <= m ; j++ )
// {
// cout << fr.a[i][j] << " ";
// }
// cout << endl;
// }
cout << n << " " << m << endl;
}
return 0;
}