1 solutions

  • 2
    @ 2025-4-30 13:51:38
    #include<bits/stdc++.h>
    #define pii pair<int,int>
    using namespace std;
    int n,ans=0x7fffffff;
    int a[20][20];
    vector<pii>r,sr;
    int vis[5][5];
    void turn_l(int x,int y)//左旋,不是平衡树! 
    {
    	pii t=pii{(x-1)*n+1,(y-1)*n+1};
    	int b[5][5];
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			b[i][j]=a[t.first+j][t.second+n-i-1];
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			a[t.first+i][t.second+j]=b[i][j];
    }
    bool check_sdk()//检查原始数独有没有问题 
    {
    	short s[20]={0};
    	for(int i=1;i<=n*n;i++)
    		for(int j=1;j<=n*n;j++)
    			if(++s[a[i][j]]>n*n)return 0;
    	return 1;
    }
    bool check(int x,int y)
    {
    	for(int i=1;i<=n*x;i++)//行 
    	{
    		short s[20]={0};
    		for(int j=1;j<=n*y;j++)
    			if(++s[a[i][j]]>1)return 0;
    	}
    	for(int j=1;j<=n*y;j++)//列 
    	{
    		short s[20]={0};
    		for(int i=1;i<=n*x;i++)
    			if(++s[a[i][j]]>1)return 0;
    	}
    	return 1;
    }
    bool dfs(int c,int x,int y)
    {
    	if(c>=ans)return 0;
    	if(check(n,n))//答案 
    	{
    		ans=c,sr=r;
    		return 1;
    	}
    	if(y==1 && !check(x-1,y))return 0;
    	else if(y!=1 && !check(x,y-1))return 0;
    	bool flag=0;
    	if(y==n+1)flag|=dfs(c,x+1,1);//下一行 
    	flag|=dfs(c,x,y+1);//不转 
    	for(int i=1;i<=3;i++)
    		turn_l(x,y),r.push_back({x,y}),flag|=dfs(c+i,x,y+1);
    	for(int i=1;i<=3;i++)r.pop_back();//回溯 
    	turn_l(x,y);//转回去,刚好转了1圈 
    	return flag;
    }
    signed main()
    {
    	cin>>n;
    	for(int i=1;i<=n*n;i++)
    		for(int j=1;j<=n*n;j++)
    		{
    			char o;cin>>o;
    			if(o>='0' && o<='9')a[i][j]=o-'0';
    			else a[i][j]=o-'A'+10;
    		}
    	if(!check_sdk())cout<<-1;
    	else if(!dfs(0,1,1))cout<<-1;
    	else
    	{
    		cout<<ans<<"\n";
    		for(int i=0;i<sr.size();i++)
    			cout<<sr[i].first<<" "<<sr[i].second<<"\n";
    	}
    	return 0;
    }
    
    • 1

    Information

    ID
    376
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    9
    Tags
    (None)
    # Submissions
    50
    Accepted
    5
    Uploaded By