魔方
作者:互联网
题目描述
kid 走进了一个 nn 行 mm 列的矩阵,不保证矩阵中有 nn 个数字 11,nn 个数字 22,\dots… , nn 个数字 mm 但 n,mn,m 均为偶数。
现有两种改变矩阵的方式:
- 选择任意一行,将这一行上的数翻转;
- 选择任意一列,将这一列上的数翻转。
每次操作可以选择任意一种方式。
现在需要通过若干次操作,将矩阵变为:
n\;行\left\{ \begin{array}{l} 1\quad2\quad3\quad\cdots\quad m\\ \\ 1\quad2\quad3\quad\cdots\quad m\\ \\ \cdots\\ \\ 1\quad2\quad3\quad\cdots\quad m\\ \end{array} \right.n行⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧123⋯m123⋯m⋯123⋯m
这样才会出现下一个存档点。
你需要帮 kid 解决这个问题。
你只需要给出答案,剩下的操作就交给 IcroXp 吧!
输入格式
第一行两个正整数 nn 和 mm,以下 nn 行,每行 mm 个正整数,表示该矩阵。
输出格式
第一行一个字符串,若不可能有可行的操作方式,则输出 NO
,否则输出 YES
;
如果输出 YES
,下一行输出一个非负整数 ansans,表示一种共需要 ansans 次操作。接下来输出 ansans 行,每行一个字符和一个数 kk(中间有空格),这个字符表示这一次操作是翻转行还是翻转列,若是对某一行进行翻转则为 0
,若翻转某一列则为 1
,kk 表示翻转第几行或是第几列。
若存在可行方案,则只需输出一组可行解即可(不需要使 ansans 最小),但你要使 ans \le n \times mans≤n×m。
本题采用 \text{SPJ}SPJ,只要翻转操作正确即可给分。
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<iomanip>
#include<bitset>
#include<map>
#include<queue>
#include<bitset>
#include<deque>
#include<vector>
#define _f(i,a,b) for(register int i=a;i<=b;++i)
#define f_(i,a,b) for(register int i=a;i>=b;--i)
#define ll long long
#define R register
#define ull unsigned long long
#define chu printf
#define inf 0x7fffffff
using namespace std;
inline int re()
{
int x=0,h=1;char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') h=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();
}
return x*h;
}
inline ll rel()
{
ll x=0;int h=1;char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') h=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();
}
return x*h;
}
const int N=100+50;
int n,m;
int a[N][N],ans[N*N][5],tot;//0表示是横向还是纵向交换,1表示交换行列编号
bool can(int x,int y)//的
{
int dx=n+1-x,dy=m+1-y;
if(a[x][y]==a[x][dy]&&a[dx][y]==a[dx][dy])// aa bb
{
if((a[x][y]==y&&a[dx][dy]==(dy)))//x x f[x f[x
{
ans[++tot][0]=0,ans[tot][1]=x;
ans[++tot][0]=1,ans[tot][1]=y;
ans[++tot][0]=0,ans[tot][1]=x;
ans[++tot][0]=1,ans[tot][1]=y;
return true;
}
else if((a[x][y]==(dy)&&a[dx][dy]==y))//f[x f[x x x
{
ans[++tot][0]=0,ans[tot][1]=dx;
ans[++tot][0]=1,ans[tot][1]=y;
ans[++tot][0]=0,ans[tot][1]=dx;
ans[++tot][0]=1,ans[tot][1]=y;
return true;
}
else
return false;
}
else if(a[x][y]==a[dx][y]&&a[x][dy]==a[dx][dy])//abab
{
if(a[x][y]==y&&a[x][dy]==dy)//
{
return true;
}
else if(a[x][y]==dy&&a[dx][dy]==y)//baba
{
ans[++tot][0]=0,ans[tot][1]=x;
ans[++tot][0]=1,ans[tot][1]=y;
ans[++tot][0]=1,ans[tot][1]=dy;
ans[++tot][0]=0,ans[tot][1]=x;
_f(i,x,(dx+x)/2)
{
swap(a[i][y],a[x+dx-i][y]);
swap(a[i][dy],a[x+dx-i][dy]);
}
return true;
}
else return false;
}
else if(a[x][y]==y&&a[x][dy]==dy&&a[dx][y]==dy&&a[dx][dy]==y)//abba
{
ans[++tot][0]=1,ans[tot][1]=dy;
ans[++tot][0]=0,ans[tot][1]=dx;
ans[++tot][0]=1,ans[tot][1]=dy;
ans[++tot][0]=0,ans[tot][1]=dx;
return true;
}
else if(a[x][y]==dy&&a[x][dy]==y&&a[dx][y]==y&&a[dx][dy]==dy)//baab
{
ans[++tot][0]=1,ans[tot][1]=y;
ans[++tot][0]=0,ans[tot][1]=x;
ans[++tot][0]=1,ans[tot][1]=y;
ans[++tot][0]=0,ans[tot][1]=x;
return true;
}
else return false;
}
//next_permutation
//||(a[x][y]==(dy)&&a[x][dy])
int main()
{
n=re(),m=re();
_f(i,1,n)
_f(j,1,m)
{
a[i][j]=re();
if(a[i][j]>m)
{
chu("NO");return 0;
}
}
_f(i,1,(n>>1))
_f(j,1,(m>>1))
{
if(can(i,j))
{
continue;
}
else
{
chu("NO");return 0;
}
}
chu("YES\n%d\n",tot);
_f(i,1,tot)
{
chu("%d %d\n",ans[i][0],ans[i][1]);
}
return 0;
}
标签:魔方,++,ans,tot,dx,dy,include 来源: https://www.cnblogs.com/403caorong/p/16028933.html