社区讨论

求救

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 条回复,欢迎继续交流。

正在加载回复...