week10模拟题

A-签到题

题意

东东有一个字符串X,该串包含偶数个字符,一半是 S 字符,一半是 T 字符
东东可以对该字符串执行 1010000 次操作:如果存在 ST 是该串的子串,则删除掉最左边的 ST。
即 TSTTSS⇒TTSS、SSSTTT⇒SSTT⇒ST⇒空

思路

根据TSTTSS⇒TTSS、SSSTTT⇒SSTT⇒ST⇒空 的过程,很显然可以模拟栈进行读入,当读到T的时候判断栈顶是否是S,如是S则弹出,若不是则T入栈;读到S正常入栈

代码

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<stack>
using namespace std;
int main()
{
	stack<char>st;
	string str;
	cin>>str;
	for(int i=0;i<str.size();i++)
	{
		if(!st.size())
		st.push(str[i]);
		else
		{
			if(str[i]=='T'&&st.top()=='S')
			st.pop();
			else st.push(str[i]);
		}
	} cout<<st.size()<<endl;return 0;
}

B-转魔方

题意

东东有一个二阶魔方,即2×2×2的一个立方体组。立方体由八个角组成。
魔方的每一块都用三维坐标(h, k, l)标记,其中h, k, l∈{0,1}。六个面的每一个都有四个小面,每个小面都有一个正整数。

对于每一步,东东可以选择一个特定的面,并把此面顺时针或逆时针转90度。

请你判断,是否东东可以在一个步骤还原这个魔方(每个面没有异色)。

输入

在这里插入图片描述
在这里插入图片描述

输出

对于每个测试用例,魔方如果可以至多 “只转一步” 恢复,输出YES,则输出NO。

思路

该题的突破点就是至多只能转一次,这说明在初始状态,至少有两个对面是是不存在异色的,(因为转一次总有两个面是不会改变的),所以读入的时候可以用一个二维数组读入将每一面记录下来,然后分别判断哪一对面没有不同颜色,确定后转动一次(顺时针逆时针转动两次即可),然后判断结果是否不存在异色

总结

这是一道模拟题,关键是找到突破点,然后进行题目框架的设计,解决

代码

#include<iostream>
#include<cstring>
using namespace std;
int a[8][6];bool flag[8];
bool judge(int x,int y,int w,int z)
{
	if(x==y&&y==w&&w==z)
	return 1;return 0;
}

int main()
{
	int n;cin>>n;
	for(int i=0;i<n;i++)
	{   memset(flag,0,sizeof(flag));
		for(int i=1;i<=6;i++)
		{   flag[i]=1;
			for(int j=1;j<=4;j++)
			{
				cin>>a[i][j];
				if(j!=1&&a[i][j]!=a[i][j-1]) flag[i]=0;
			}		
		}
		bool tag=0;
     	for(int i=1;i<=6;i++)
     	{
		if(!flag[i])tag=1;
    	}if(!tag)
      	{   cout<<"YES"<<endl;
		continue;
    	}
		tag=0;
    	if(flag[1]&&flag[3]&&judge(a[2][1], a[2][2], a[5][3], a[5][1]) && judge(a[5][4], a[5][2], a[4][1], a[4][2])&& judge(a[4][3], a[4][4], a[6][4], a[6][2])&& judge(a[6][3], a[6][1], a[2][3], a[2][4]))
    	tag=1;
    	if(flag[1]&&flag[3]&& judge(a[2][1], a[2][2], a[6][4], a[6][2]) && judge(a[6][3], a[6][1], a[4][1], a[4][2])&& judge(a[4][3], a[4][4], a[5][3], a[5][1])&& judge(a[5][4], a[5][2], a[2][3], a[2][4]))
    	tag=1;
    	if(tag)
    	{
    		cout<<"YES"<<endl;continue;
		}tag=0;
		if(flag[2]&&flag[4]&&judge(a[1][3], a[1][4], a[5][2], a[5][1]) && judge(a[5][4], a[5][3], a[3][3], a[3][4])&& judge(a[3][1], a[3][2], a[6][1], a[6][2])&& judge(a[6][3], a[6][4], a[1][1], a[1][2]))
    	tag=1;
    	
    	if(flag[2]&&flag[4]&&judge(a[1][3], a[1][4], a[6][1], a[6][2]) && judge(a[6][3], a[6][4], a[3][3], a[3][4])&& judge(a[3][1], a[3][2], a[5][2], a[5][1])&& judge(a[5][3], a[5][4], a[1][1], a[1][2]))
    	tag=1;
    	if(tag)
    	{
    		cout<<"YES"<<endl;continue;
		}tag=0;
    	if(flag[5]&&flag[6]&&judge(a[2][2], a[2][4], a[1][3], a[1][1]) && judge(a[1][2], a[1][4], a[4][3], a[4][1])&& judge(a[4][4], a[4][2], a[3][1], a[3][3])&& judge(a[3][2], a[3][4], a[2][1], a[2][3]))
    	tag=1;
    
    	if(flag[5]&&flag[6]&&judge(a[2][2], a[2][4], a[3][1], a[3][3]) && judge(a[3][2], a[3][4], a[4][1], a[4][3])&& judge(a[4][2], a[4][4], a[1][1], a[1][3])&& judge(a[1][2], a[1][4], a[2][1], a[2][3]))
    	tag=1;
    	if(tag)
    	{
    		cout<<"YES"<<endl;continue;
		}
   	
    	cout<<"NO"<<endl;
	  
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值