zoukankan      html  css  js  c++  java
  • 【2014广州市选day1】JZOJ2020年9月12日提高B组T3 消除游戏

    【2014广州市选day1】JZOJ2020年9月12日提高B组T3 消除游戏

    题目

    Description

    相信大家玩过很多网络上的消除类型的游戏,一般来说就是在一个大拼图内找出相同的部分进行最大程度的消除操作。下面我们给出一个拼图以及消除规则,请你找到最大限度的消除方案。
    【拼图组成】
    拼图为 N行 * M列 的矩阵,每个格子中都放着一个数字,范围是0到9。例如:
    4*5 矩阵:
    在这里插入图片描述
    【消除规则】
    我们可以从拼图的任意一个格子(坐标【X,Y】)出发,消除该格子的数字,然后,向格子X坐标正负1,Y坐标正负1的范围,寻找和原来格子相同的数字(不能找已经消除过的格子),一并消除,然后在新的格子继续重复上述过程,直到找不到相同的数字为止。这个过程称为消除过程。上面的矩阵中,我们可用以下几种消除方案:
    在这里插入图片描述

    Input

    输入第一行为两个整数N (1<=N<=30),M(1<=<=30),用空格隔开下面N行,每行有M个整数(范围0到9)

    Output

    输出一行为两个整数 X,Y,中间用一个空格隔开,其中X代表消除的数字,Y代表最大的消除数目。
    如果一个拼图中有多个数字可以消除相同的最大的数目,那么则输出数字最小的那个解。

    Sample Input

    4 5
    12345
    22340
    09070
    12300

    Sample Output

    0 5

    题目

    题意

    给出一个由0~9组成的(n*m)的矩阵
    问最长相同数字链

    分析

    (BFS)不适合,采用(DFS)
    枚举起点
    然后一条路走
    走到最后没得走了统计答案

    Code

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,ans,ans1,s,a[35][35],d[1005][3],f1[9]={0,-1,-1,-1,0,0,1,1,1},f2[9]={0,-1,0,1,-1,1,-1,0,1};
    bool b[35][35];
    char str[35];
    int read()
    {
    	int res=0;char ch=getchar();
    	while (ch<'0'||ch>'9') ch=getchar();
    	while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch-'0'),ch=getchar();
    	return res;
    }
    void dfs(int x,int y,int s)
    {
    	int t=0,xx,yy;
    	for (int i=1;i<=8;++i)
    	{
    		xx=x+f1[i];
    		yy=y+f2[i];
    		if (xx>=1&&xx<=n&&yy>=1&&yy<=m&&!b[xx][yy]&&a[xx][yy]==a[x][y])
    		{
    			b[xx][yy]=true;
    			dfs(xx,yy,s+1);
    			b[xx][yy]=false;
    			++t;
    		}
    			
    	}
    	if (t==0)
    	{
    		if (s>ans||(s==ans&&a[x][y]<ans1))
    		{
    			ans=s;
    			ans1=a[x][y];
    		}
    	}
    }
    int main()
    {
    	freopen("clear.in","r",stdin);
    	freopen("clear.out","w",stdout);
    	n=read();m=read();
    	for (int i=1;i<=n;++i)
    	{
    		scanf("%s",str+1);
    		for (int j=1;j<=m;++j)
    			a[i][j]=str[j]-'0';
    	}
    	ans1=10;
    	for (int i=1;i<=n;++i)
    		for (int j=1;j<=m;++j)
    			if (!b[i][j]) 
    				b[i][j]=true,dfs(i,j,1),b[i][j]=false;
    	printf("%d %d
    ",ans1,ans);
    	fclose(stdin);fclose(stdout);
    	return 0;
    }
    
  • 相关阅读:
    共享纸巾更换主板代码分析 共享纸巾主板更换后的对接代码
    Python Django Ajax 传递列表数据
    Python Django migrate 报错解决办法
    Python 创建字典的多种方式
    Python 两个list合并成一个字典
    Python 正则 re.sub替换
    python Django Ajax基础
    Python Django 获取表单数据的三种方式
    python Django html 模板循环条件
    Python Django ORM 字段类型、参数、外键操作
  • 原文地址:https://www.cnblogs.com/Livingston/p/13657232.html
Copyright © 2011-2022 走看看