月模拟题和限时大模拟

A - 掌握魔法の东东 II

在这里插入图片描述
在这里插入图片描述
解题过程与反思
按道理说一个不需要数学不需要算法只需要暴力的题应该是可以写出来的…虽然当时的牌型判断写出来了(后来发现也不太ok)很少很少的牌型也可以用一个二维数组来表示,但是如何枚举牌,我最初选择令人窒息的dfs,结果从8个牌里选3张的样例试了一下它就一去不返。用for循环枚举吧,二维数组拍成一维数组,三个for,可能是牌的序号写的有问题,数组访问越界,改了改觉得好不直观啊(自己晕自己)又改成二维数组了,六个for,结果避免重复的判断写了个迷惑,8个牌里选3张的样例选出了1023个结果,这A83也才336种啊,至少也得是个偶数吧,枚举不出来,时间就这样过去,当终于改成336种结果的时候,它wa了。换了个样例发现是同花的判断出了错,因为两个要判断花色的情况只需要判断花色是不是都相同没有需要记录花色相同的牌数,于时就把循环改成if了(完全完全忽略了根本原因),后来还是wa,好在终于发现了用sort排序的那两个数组是从1开始储存的,改了之后终于过了,不停地被下标坑但是每次都对它非常信任觉得一定是if条件的问题(虽然它们都有问题)菜还不细心。

#include <iostream>
#include <stack>
#include <cmath>
#include <cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
int pai[27][6]={0};
int tp[10]={0};
int c=0;int A,B,a1,b1,a2,b2;
struct have
{int shu[6];
 int hua[6];
 int num;
 	void push(int s,int h)
{ num++;
  int t=num; 
  hua[t]=h;
  shu[t]=s;
	
}

};
void jug(have &res)
{ int f=0;
	 sort(res.hua+1,res.hua+6);
	 if(res.hua[1]==res.hua[5]&&res.hua[1]==res.hua[2]&&res.hua[2]==res.hua[3]&&res.hua[3]==res.hua[4]&&res.hua[4]==res.hua[5])
	 f=5;
	 sort(res.shu+1,res.shu+6);
	 if(res.shu[2]-res.shu[1]==1&&res.shu[3]-res.shu[2]==1&&res.shu[4]-res.shu[3]==1&&res.shu[5]-res.shu[4]==1&&f==5)
	  tp[1]++;
	 
	 else if((res.shu[1]==res.shu[2]&&res.shu[2]==res.shu[3]&&res.shu[3]==res.shu[4])||(res.shu[2]==res.shu[3]&&res.shu[3]==res.shu[4]&&res.shu[4]==res.shu[5]))
	  tp[2]++;
	 else if((res.shu[1]==res.shu[2]&&res.shu[3]==res.shu[4]&&res.shu[4]==res.shu[5])||(res.shu[1]==res.shu[2]&&res.shu[2]==res.shu[3]&&res.shu[4]==res.shu[5]))
	  tp[3]++; 
	  else if(f==5)
	  tp[4]++;
	  else if(res.shu[2]-res.shu[1]==1&&res.shu[3]-res.shu[2]==1&&res.shu[4]-res.shu[3]==1&&res.shu[5]-res.shu[4]==1)
	  tp[5]++;
	  else if((res.shu[3]==res.shu[4]&&res.shu[4]==res.shu[5])||(res.shu[1]==res.shu[2]&&res.shu[2]==res.shu[3])||(res.shu[2]==res.shu[3]&&res.shu[3]==res.shu[4]))
	  tp[6]++;
	  else if((res.shu[1]==res.shu[2]&&res.shu[4]==res.shu[5])||(res.shu[2]==res.shu[3]&&res.shu[4]==res.shu[5])||(res.shu[1]==res.shu[2]&&res.shu[3]==res.shu[4]))
	  tp[7]++;
	  else if((res.shu[1]==res.shu[2])||(res.shu[2]==res.shu[3])||(res.shu[3]==res.shu[4])||(res.shu[4]==res.shu[5]))
	  tp[8]++;
	  else 
	  tp[9]++;
	  
	  res.num=2;
	  res.hua[1]=b1;
		res.hua[2]=b2;
		res.shu[1]=a1;
		res.shu[2]=a2;
	
	
}

void  mj(have &res)
{  
for (int i=0; i<A; i++)
for (int i2=0; i2<B; i2++)
   if(pai[i][i2]==0)
    for (int j=0; j<A; j++)
    for (int j2=0; j2<B; j2++)
     if(pai[j][j2]==0&& (j!=i||j2!=i2))
       for (int u=0; u<A; u++)
        for (int u2=0; u2<B; u2++)
         if(pai[u][u2]==0 && (u!=j || u2!=j2) && (u!=i||u2!=i2))
            {
    		    res.push(j,j2);
    		    res.push(i,i2);
    		    res.push(u,u2);
    			jug(res);
    			
	     	}
    		    	
}

int  main(int  argc, char** argv) {
      
 
	    cin>>A>>B;
	    cin>>a1>>b1;
	    cin>>a2>>b2;
		int huasame=0,numsame=0;
		
		pai[a1][b1]=1;
		pai[a2][b2]=1;
		have res;
		res.num=2;
		res.hua[1]=b1;
		res.hua[2]=b2;
		res.shu[1]=a1;
		res.shu[2]=a2;
		mj(res);
		for(int i=1;i<=9;i++)
		{cout<<tp[i]/6<<" ";
		}
	return 0;
}

画图

问题描述
  用 ASCII 字符来画图是一件有趣的事情,并形成了一门被称为 ASCII Art 的艺术。例如,下图是用 ASCII 字符画出来的 CSPRO 字样。
  ….…_
  ././.||….|……/.
  |.|…_
.|.|
).|.|
).|.|.|.|
  |.|.).|…/|….<|.||.|
  ._|
/|
|…|
|._\___/.
  本题要求编程实现一个用 ASCII 字符来画图的程序,支持以下两种操作:
  Ÿ 画线:给出两个端点的坐标,画一条连接这两个端点的线段。简便起见题目保证要画的每条线段都是水平或者竖直的。水平线段用字符 - 来画,竖直线段用字符 | 来画。如果一条水平线段和一条竖直线段在某个位置相交,则相交位置用字符 + 代替。
  Ÿ 填充:给出填充的起始位置坐标和需要填充的字符,从起始位置开始,用该字符填充相邻位置,直到遇到画布边缘或已经画好的线段。注意这里的相邻位置只需要考虑上下左右 4 个方向,如下图所示,字符 @ 只和 4 个字符 * 相邻。
  ..
  @
  .
.
输入格式
  第1行有三个整数m, n和q。m和n分别表示画布的宽度和高度,以字符为单位。q表示画图操作的个数。
  第2行至第q + 1行,每行是以下两种形式之一:
  Ÿ 0 x1 y1 x2 y2:表示画线段的操作,(x1, y1)和(x2, y2)分别是线段的两端,满足要么x1 = x2 且y1 ≠ y2,要么 y1 = y2 且 x1 ≠ x2。
  Ÿ 1 x y c:表示填充操作,(x, y)是起始位置,保证不会落在任何已有的线段上;c 为填充字符,是大小写字母。
  画布的左下角是坐标为 (0, 0) 的位置,向右为x坐标增大的方向,向上为y坐标增大的方向。这q个操作按照数据给出的顺序依次执行。画布最初时所有位置都是字符 .(小数点)。
输出格式
  输出有n行,每行m个字符,表示依次执行这q个操作后得到的画图结果。
样例输入
4 2 3
1 0 0 B
0 1 0 2 0
1 0 0 A
样例输出
AAAA
A–A
样例输入
16 13 9
0 3 1 12 1
0 12 1 12 3
0 12 3 6 3
0 6 3 6 9
0 6 9 12 9
0 12 9 12 11
0 12 11 3 11
0 3 11 3 1
1 4 2 C
样例输出

…±-------+…
…|CCCCCCCC|…
…|CC±----+…
…|CC|…
…|CC|…
…|CC|…
…|CC|…
…|CC|…
…|CC±----+…
…|CCCCCCCC|…
…±-------+…

评测用例规模与约定
  所有的评测用例满足:2 ≤ m, n ≤ 100,0 ≤ q ≤ 100,0 ≤ x < m(x表示输入数据中所有位置的x坐标),0 ≤ y < n(y表示输入数据中所有位置的y坐标)。

解题过程与反思
画图面板比较小用二维数组保存字符,字符填充用dfs就可以,一开始感觉可以做出来的结果用样例二试了一下,那个c躺倒了…又是下标出错了,改阿改试呀试终于让c站了起来,兴高采烈的去提交,结果40.迷惑又用样例一试了一下,端点出问题了(居然还有分)结果改了端点的判断条件图又花了,开始整数组下标,i和j是不是又写倒了,改到最后变量名好像和一开始想的意义不一样了变得奇怪起来但是它过了…以后一定要好好写注释和变量名并且重视所有样例。
在这里插入图片描述

#include <iostream>
#include<algorithm> 
using namespace std; 
char p[111][111];
int movex[]={-1,1,0,0};
int movey[]={0,0,-1,1};
int n,m;
void dfs (int x,int y,char c)
{ 
  if(x<0||y<0||x>n||y>m)
  return;
  
  if(p[x][y]==c||p[x][y]=='+'||p[x][y]=='-'||p[x][y]=='|')
  return;
  
  else
  {p[x][y]=c;
  for(int i=0;i<4;i++)
  {
  	dfs(x+movex[i],y+movey[i],c);
  }
  
  }
  
 
	
}

int main()  
{   int q,c,x1,x2,y1,y2;
    char  cha; 
     cin>>m>>n>>q;
     for(int i=0;i<=n;i++)
	 {for(int j=0;j<=m;j++)
	  {
	  	  p[i][j]='.';
	  }
	  
	 }
     for(int i=0;i<q;i++)
     {cin>>c;
      if(c==0)
      {cin>>x1>>y1>>x2>>y2;
       if(x1==x2)
       {int begin=min(y1,y2);
        int end=max(y1,y2);
        for(int j=begin;j<=end;j++)
        {if(p[j][x1]=='-'||p[j][x1]=='+')
         p[j][x1]='+';
         else
		 p[j][x1]='|';
		}
       	
	   }
	   if(y1==y2)
       {int begin=min(x1,x2);
        int end=max(x1,x2);
        for(int j=begin;j<=end;j++)
        {if(p[y1][j]=='|'||p[y1][j]=='+')
         p[y1][j]='+';
         else
		 p[y1][j]='-';
		}
       	
	   }
	  }
     
	   if(c==1)
	   {
	   	cin>>x1>>y1>>cha;
	   	dfs(y1,x1,cha);
	   }
	 	
     	
	 }
	 for(int i=n-1;i>=0;i--)
	 {for(int j=0;j<m;j++)
	  {
	  	 cout<<p[i][j];
	  }
	 	cout<<endl;
	 }
	  
	  
	 
   return 0;  
}  

反思
几乎没有吸取教训啊,两个题之间的时间也不算很久就把问题忘掉了,无时无刻不想着偷懒,老是变量搞混,下标出错,数据类型不对,还错用返回值void的函数给int赋值(编译器居然不报错,原因是返回值会从寄存器或栈帧中读取,runtime error)结果就是用大量时间调试,没有学到东西还各种怀疑人生。还是经常劝劝自己给函数取有意义(且十分钟后还能看得懂的)的名字,多思考多学习,不要轻易放弃。

发布了9 篇原创文章 · 获赞 0 · 访问量 110

猜你喜欢

转载自blog.csdn.net/qq_45224092/article/details/105283350