首页 > 代码库 > QQ游戏连连看

QQ游戏连连看

描述

众所周知,lfq198502非常喜欢玩连连看游戏。连连看游戏 ,只要将相同花色的两张牌用三根以内的直线连在一起就可以消除, 规则简单容易上手 。

操作:第一次使用鼠标点击棋盘中的棋子,该棋子此时为“被选中”,以特殊方式显示;再次以鼠标点击其他棋子,若该棋子与被选中的棋子图案相同,且把第一个棋子到第二个棋子连起来,中间的直线不超过 3 根,则消掉这一对棋子,否则第一颗棋子恢复成未被选中状态,而第二颗棋子变成被选中状态。

我们可以把连连看的界面想象成一个10×10的方格,每个方格内都放有一种类型的图案或者为空,简单起见,我们用不同的字符代表不同的图案,空格表示没有图案。你的任务是,给出游戏的初始界面,和游戏过程中lfq198502鼠标点击的坐标记录,判断他在这些操作后是否将图案全部消完。

输入

输入包含多组测试情况,每组情况数据包含两部分。
第一部分:10行字符串,每行包含10个字符(空格表示该方格为空,其他字符表示方格中的有用该字符表示的图案),表示游戏的初始界面。
第二部分:首先是一个整数n,表示lfq198502的鼠标点击次数;接下来的n行,每行两个整数x,y(1≤x≤10, 1≤y≤10),表示鼠标点击位置所在的行和列。

输出

每组测试情况输出一行。如果lfq198502能够将图案全部消除,输出“Yes,all patterns are eliminated!”;否则,输出“No,m pattern(s) are left!”。

样例输入

2
abccba   x
bax       
 ab   8   
         8
          
          
          
@        (
          
  (   @   
18
1 3
1 4
1 2
1 5
1 1
1 6
1 10
2 3
2 2
3 2
3 3
2 1
3 7
4 10
8 1
10 7
10 3
8 10
ab       8
ba        
          
         8
          
          
          
@         
          
      @   
8
1 1
2 2
1 2
2 1
1 10
4 10
8 1
10 7

样例输出

Yes,all patterns are eliminated!
No,4 pattern(s) are left!


#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
char a[20][20];
int f[20][20];
int ff[20][20];
int vir[]={0,1,0,-1,0};
int t,m,x1,y1,x2,y2,flag,tt;
char ch;
int dfs(int x,int y,int temp,int fx)//x,y是消除的点,temp是记录转弯的次数,fx是记录方向
{
    if(flag)return 0;
    if(temp>3)return 0;
    if(x==x1&&y==y1)
    {
        flag=1;
        return 0;
    }
    for(int i=0;i<4;i++)
    {
        int ax=x+vir[i];
        int ay=y+vir[i+1];
        if(ax>=1&&ax<=10&&ay>=1&&ay<=10&&a[ax][ay]==' '&&!ff[ax][ay])
        {
        	ff[ax][ay] = 1;
        	int ttt = temp+1;
            if(fx==i)
            {
                ttt--;
                x2=ax;
                y2=ay;
            }
           dfs(ax,ay,ttt,i);
           ff[ax][ay] = 0;
        }
    }
    return 0;
}
int main()
{
    scanf("%d",&t);
    int x,y;
    while(t--)
    {
       memset(a,' ',sizeof(a));
       for(int i=1;i<=10;i++)
       {
             getchar();
         for(int j=1;j<=10;j++)
         {
            ch=getchar();
            if(ch==' ')a[i][j]=' ';
            else a[i][j]=ch;
         }
       }
       getchar();
       scanf("%d",&m);
       memset(f,0,sizeof(f));
       x1=-1,y1=-1;
       while(m--)
       {

           scanf("%d%d",&x,&y);
           if(!f[x][y]&&x1==-1&&y1==-1)
           {
               f[x][y]=1;
               x1=x;
               y1=y;
           }
           else
           {
               memset(ff,0,sizeof(ff));
               char p,q;
               p=a[x][y];
               q=a[x1][y1];
               if(p==q)
               {
                   a[x][y]=' ';
                   a[x1][y1]=' ';
                   x2=x;y2=y;
                   flag=tt=0;
                   f[x][y] = 1;
                   dfs(x,y,0,-1);
                   if(!flag)
                   {
                     a[x][y]=p;
                     a[x1][y1]=q;
                     f[x1][y1]=0;
                     f[x][y]=1;
                     x1=x;
                     y1=y;
                   }
                   else
                   {
                     f[x1][y1]=0;
                     f[x][y]=0;
                     x1=-1;
                     y1=-1;
                   }
               }
              else
              {
                  f[x][y]=1;
                  f[x1][y1]=0;
                  x1=x;
                  y1=y;
              }
           }
       }
       int flag1=0;
       for(int i=1;i<=10;i++)
        for(int j=1;j<=10;j++)
         if(a[i][j]!=' ')
         {
             flag1++;
         }
        if(flag1)
            printf("No,%d pattern(s) are left!\n",flag1);
        else
             printf("Yes,all patterns are eliminated!\n");
    }
    return 0;
}