求找bug,悬关
查看原帖
求找bug,悬关
530468
_determination_楼主2023/12/13 16:37

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;
}
2023/12/13 16:37
加载中...