zoukankan      html  css  js  c++  java
  • 2048(lj模拟)

    题目描述

    此时,Conan却在一旁玩着2048。
    这是一个4*4的矩阵,初始全为0。每次一个没有数字的格子中会随机出现一个2或4,每次可以选择上下左右其中一个方向去滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢外,相同数字的方块在靠拢、相撞时会相加。
    Conan想看看今天自己运气咋样,于是就闭着眼睛,在屏幕上随便滑来滑去。所以这个模拟的任务就交给你了。过了一会,他然后睁开眼睛,如果游戏没有结束(滑动后如果没有空格子,则游戏结束),请输出矩阵(格式参见样例),否则输出“Game over!”(不包含引号)。

    输入
    输入第一行包含一个整数N,表示Conan滑了几下。
    接下来N 行,x, y, v, f表示第x行与第y列出现数字为v后,Conan滑的方向为f(f为字符,U, D, L, R分别表示向上下左右滑)。
    行从上往下1-4标号,列从左往右1-4标号。
    数据保证在游戏未结束时,只会在空白区域出现数字。

    输出
    输出按题目描述。

    输入样例
    8
    1 3 4 L
    2 3 2 U
    2 4 2 R
    4 1 2 L
    3 4 2 L
    3 2 2 D
    1 3 4 R
    1 3 2 U

    输出样例
    0 0 2 8
    0 0 0 2
    0 0 0 8
    0 0 0 0

    说明
    【数据规模与约定】 对于100%的数据满足。
    .
    .
    .
    .
    .
    分析
    若4 4 8 4向左撞的话,得8 8 4 0
    每做完一次滑动就判断是否能进行下一次滑动,最后一次不判断
    .
    .
    .
    .
    .
    程序:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int a[10][10],b[10][10];
    bool nc[10],bz;
    
    void work1()
    {
    	for (int i=1;i<=4;i++)
    	{
    		int k=0;
    		for (int j=1;j<=4;j++)
    		if (a[i][j]!=0)
    		{
    			k++;
    			a[i][k]=a[i][j];
    			if (k!=j) a[i][j]=0;
    		}
    	}
    	for (int i=1;i<=4;i++)
    		for (int j=1;j<=3;j++)
    			if (a[i][j]==a[i][j+1]&&a[i][j]!=0)
    			{
    				a[i][j]+=a[i][j+1];
    				a[i][j+1]=0;
    			}
    	for (int i=1;i<=4;i++)
    	{
    		int k=0;
    		for (int j=1;j<=4;j++)
    			if (a[i][j]!=0)
    			{
    				k++;
    				a[i][k]=a[i][j];
    				if (k!=j) a[i][j]=0;
    			}
    	}
    }
    
    void work2()
    {
    	for (int i=1;i<=4;i++)
    	{
    		int k=5;
    		for (int j=4;j>=1;j--)
    		if (a[i][j]!=0)
    		{
    			k--;
    			a[i][k]=a[i][j];
    			if (k!=j) a[i][j]=0;
    		}
    	}
    	for (int i=1;i<=4;i++)
    		for (int j=4;j>=2;j--)
    			if (a[i][j]==a[i][j-1]&&a[i][j]!=0)
    			{
    				a[i][j]+=a[i][j-1];
    				a[i][j-1]=0;
    			}
    	for (int i=1;i<=4;i++)
    	{
    		int k=5;
    		for (int j=4;j>=1;j--)
    			if (a[i][j]!=0)
    			{
    				k--;
    				a[i][k]=a[i][j];
    				if (k!=j) a[i][j]=0;
    			}
    	}
    }
    
    
    void work3()
    {
    	for (int i=1;i<=4;i++)
    	{
    		int k=0;
    		for (int j=1;j<=4;j++)
    		if (a[j][i]!=0)
    		{
    			k++;
    			a[k][i]=a[j][i];
    			if (k!=j) a[j][i]=0;
    		}
    	}
    	for (int i=1;i<=4;i++)
    		for (int j=1;j<=3;j++)
    			if (a[j][i]==a[j+1][i]&&a[j][i]!=0)
    			{
    				a[j][i]+=a[j+1][i];
    				a[j+1][i]=0;
    			}
    	for (int i=1;i<=4;i++)
    	{
    		int k=0;
    		for (int j=1;j<=4;j++)
    			if (a[j][i]!=0)
    			{
    				k++;
    				a[k][i]=a[j][i];
    				if (k!=j) a[j][i]=0;
    			}
    	}
    }
    
    void work4()
    {
    	for (int i=1;i<=4;i++)
    	{
    		int k=5;
    		for (int j=4;j>=1;j--)
    		if (a[j][i]!=0)
    		{
    			k--;
    			a[k][i]=a[j][i];
    			if (k!=j) a[j][i]=0;
    		}
    	}
    	for (int i=1;i<=4;i++)
    		for (int j=4;j>=2;j--)
    			if (a[j][i]==a[j-1][i]&&a[j][i]!=0)
    			{
    				a[j][i]+=a[j-1][i];
    				a[j-1][i]=0;
    			}
    	for (int i=1;i<=4;i++)
    	{
    		int k=5;
    		for (int j=4;j>=1;j--)
    			if (a[j][i]!=0)
    			{
    				k--;
    				a[k][i]=a[j][i];
    				if (k!=j) a[j][i]=0;
    			}
    	}
    }
    
    void fz1()
    {
    	for (int i=1;i<=4;i++)
    		for (int j=1;j<=4;j++)
    			b[i][j]=a[i][j];
    	return;
    }
    
    void fz2()
    {
    	for (int i=1;i<=4;i++)
    		for (int j=1;j<=4;j++)
    			a[i][j]=b[i][j];
    	return;
    }
    
    bool check()
    {
    	for (int i=1;i<=4;i++)
    		for (int j=1;j<=4;j++)
    			if (a[i][j]==0) return true;
    	return false;
    }
    
    
    void work5()
    {
    	work1();nc[1]=check();fz2();
        work2();nc[2]=check();fz2();
        work3();nc[3]=check();fz2();
    	work4();nc[4]=check();fz2();
    }
    
    void work6()
    {
    	fz1();
    	work5();
    	if (nc[1]==false&&nc[2]==false&&nc[3]==false&&nc[4]==false) bz=false;
    }
    
    int main()
    {
    	int n;
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++)
    	{
    		int x,y,v;
    		char f;
    		cin>>x>>y>>v>>f;
    		if (a[x][y]!=0) 
    		{
    			cout<<"Game over!";
    			return 0;
    		}
    		a[x][y]=v;
    		if (f=='L') work1(); else 
    		if (f=='R') work2(); else 
    		if (f=='U') work3(); else
    		if (f=='D') work4();
    		bz=true;
    		if (i!=n) work6();
    		if (bz==false)
    		{
    			cout<<"Game over!";
    			return 0;
    		}
    	}
    	for (int i=1;i<=4;i++)
    	{
    		for (int j=1;j<=3;j++)
    			cout<<a[i][j]<<' ';
    		cout<<a[i][4];
    		cout<<endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    Teacher Bo HDU 5762(暴力)
    The Unique MST POJ1679(次小生成树)
    Sqrt Bo hdu 5752
    Borg Maze POJ 3026(BFS+最小生成树)
    Highways POJ 1751(最小生成树)
    hdu---2050---折线分割平面
    POj---1469---Courses
    poj---2349---Arctic Network
    poj-2528-Mayor's posters
    POJ---3468---A Simple Problem with Integers
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/10292837.html
Copyright © 2011-2022 走看看