ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

魔方

2022-03-20 08:33:25  阅读:135  来源: 互联网

标签:魔方 ++ ans tot dx dy include


题目描述

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有