C/C++ 拼凑春联

题目描述

春节到了,春联是必不可少的东西^_^。
众所周知,一幅对联的“上联”和“下联”是对偶(也叫对仗)的。例如:
上联:九州雨顺千山绿
下联:六合风调万户丰

BluePoint不喜欢已有的春联组合,所以此人想从已知的佳句中找出两句对偶的,组合出一些新的春联^_*。图书馆有一个“名句文库”,BluePoint想知道其中的名句一共可以拼凑出多少组不同的春联,请您帮帮忙,好吗?
为了简化问题,BluePoint只选择七个字的佳句,并把它们的形式化成了字母(按意群将句子分组、断开)。例如“鲲鹏展翅乾坤大”可化为“AABBCCD”,也可以化为“YYQQZZH”,即字母只起显示结构的作用,与句子内容无关。
两个句子按照字母的连续性分段后,如果各成分的字数依次相同,则这两个句子对偶。例如:例如“QBLLLDE”和“DEZZZBF”,将第一句按照字母的连续性分为5段:Q、B、LLL、D、E,每段长度分别为1、1、3、1、1,而第二句经过断句后,各段的长度也分别为1、1、3、1、1,因此这两个句子对偶。
注:“AABCCCD”和“EEFBBBE”这类句子也算作对偶:第二个句子中两次出现“E”,但“E”是断开的,所以断句情况仍为:2、1、3、1。由于字母只用来突出结构,所以如果出现两次同样的字母串,则它们表示的春联内容不相同,当然,它们是对偶的。

输入

第一行,一个整数N,2≤N≤100000 以下N行,每行都有一个由七个大写字母组成的字符串,代表一个佳句。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
CPaintDC dc(this); CWnd * pWnd = dc.GetWindow(); CWnd * item1; item1=this->GetDlgItem(IDC_STATIC1); CRect * rect=new CRect; item1->GetWindowRect(rect); POINT a,b; a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); CDC memDC; CBitmap cBitmap; BITMAP bitmap; cBitmap.LoadBitmap(IDB_BITMAP2); //通过资源标识加载图片 // HBITMAP hbmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),"F:\\MFC\\duilian2\\res\\下联.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); //通过文件路径加载图片 // cBitmap.Attach(hbmp); cBitmap.GetBitmap(&bitmap); maxh=bitmap.bmHeight; memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(a.x,a.y,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); //////////////////////////////////////////////////////////////////////////// CRgn rgn,temprgn; rgn.CreateRectRgn(a.x,a.y,a.x+bitmap.bmWidth+5,a.y+h+4); item1=this->GetDlgItem(IDC_STATIC2); item1->GetWindowRect(rect); a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); cBitmap.DeleteObject(); cBitmap.LoadBitmap(IDB_BITMAP1); cBitmap.GetBitmap(&bitmap); // memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(a.x-1,a.y-2,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); temprgn.CreateRectRgn(a.x,a.y,a.x+bitmap.bmWidth+4,a.y+h+4); rgn.CombineRgn(&rgn,&temprgn,RGN_OR); /////////////////////////////////////////////////////////////////////////////////////// item1=this->GetDlgItem(IDC_STATIC3); item1->GetWindowRect(rect); a=rect->TopLeft(); b=rect->BottomRight(); ::ScreenToClient(this->m_hWnd,&a); ::ScreenToClient(this->m_hWnd,&b); cBitmap.DeleteObject(); cBitmap.LoadBitmap(IDB_BITMAP3); cBitmap.GetBitmap(&bitmap); maxw=bitmap.bmWidth; // memDC.CreateCompatibleDC(&dc); memDC.SelectObject(&cBitmap); dc.BitBlt(b.x-2-bitmap.bmWidth,a.y-2,bitmap.bmWidth,bitmap.bmHeight,&memDC,0,0,SRCCOPY); temprgn.DeleteObject(); temprgn.CreateRectRgn(b.x-w,a.y,b.x,a.y+bitmap.bmHeight); rgn.CombineRgn(&rgn,&temprgn,RGN_OR); /////////////////////////////////////////////////////////////////////////////// pWnd->SetWindowRgn(rgn,true); // pWnd->SetForegroundWindow(); rgn.DeleteObject(); temprgn.DeleteObject(); SetTimer(0,15,NULL); //CDialog::OnPaint();

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值