1 solutions
-
2
#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