CSP 俄罗斯方块(201604-2)
2018-06-17 23:05:12来源:未知 阅读 ()
游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块。每一轮,都会有一个新的由4个小方块组成的板块从方格图的上方落下,玩家可以操作板块左右移动放到合适的位置,当板块中某一个方块的下边缘与方格图上的方块上边缘重合或者达到下边界时,板块不再移动,如果此时方格图的某一行全放满了方块,则该行被消除并得分。
在这个问题中,你需要写一个程序来模拟板块下落,你不需要处理玩家的操作,也不需要处理消行和得分。
具体的,给定一个初始的方格图,以及一个板块的形状和它下落的初始位置,你要给出最终的方格图。
输入的第16至第19行包含新加入的板块的形状,每行包含4个数字,组成了板块图案,同样0表示没方块,1表示有方块。输入保证板块的图案中正好包含4个方块,且4个方块是连在一起的(准确的说,4个方块是四连通的,即给定的板块是俄罗斯方块的标准板块)。
第20行包含一个1到7之间的整数,表示板块图案最左边开始的时候是在方格图的哪一列中。注意,这里的板块图案指的是16至19行所输入的板块图案,如果板块图案的最左边一列全是0,则它的左边和实际所表示的板块的左边是不一致的(见样例)
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 0 0 0 1 1 1 1
0 0 0 0 1 0 0 0 0 0
0 0 0 0
0 1 1 1
0 0 0 1
0 0 0 0
3
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
1 1 1 1 1 1 1 1 1 1
0 0 0 0 1 1 0 0 0 0
思路
1 #include<iostream> 2 using namespace std; 3 4 int main(){ 5 int a[15][10]; 6 int in[4][4]; 7 for(int i=0;i<15;i++){ 8 for(int j=0;j<10;j++){ 9 cin>>a[i][j]; 10 } 11 } 12 for(int i=0;i<4;i++){ 13 for(int j=0;j<4;j++){ 14 cin>>in[i][j]; 15 } 16 } 17 int n; 18 cin>>n; 19 20 int m[4]; 21 for(int i=0;i<4;i++){ //计算掉落方块每列的相对长度 22 m[i]=0; 23 for(int j=0;j<4;j++){ 24 if(in[j][i]==1) m[i]=j+1; 25 } 26 } 27 int f[4]; 28 for(int i=n-1;i<n+3;i++){ //计算原有方块每列的相对长度 29 f[i-n+1]=0; 30 for(int j=0;j<15;j++){ 31 if(a[j][i]==1){ 32 f[i-n+1]=15-j; 33 break; 34 } 35 } 36 } 37 int max=0; 38 for(int i=0;i<4;i++){ //计算最大长度,即掉落方块的最高点 39 if(m[i]!=0&&m[i]+f[i]>=max){ 40 max=m[i]+f[i]; 41 } 42 } 43 for(int i=0;i<4;i++){ 44 for(int j=0;j<4;j++){ 45 if(in[i][j]) a[15-max+i][n-1+j]=1; 46 } 47 } 48 for(int i=0;i<15;i++){ 49 for(int j=0;j<10;j++){ 50 cout<<a[i][j]<<" "; 51 } 52 cout<<endl; 53 } 54 return 0; 55 }
第一种思路的代码:
1 #include<stdio.h> 2 int a[19][10],b[4][4]; 3 int compareBlock(int r,int c){ 4 for(int i=0;i<4;i++){ 5 for(int j=0;j<4;j++){ 6 if(b[i][j]==1&&a[i+r][j+c]==1) return 1; 7 } 8 } 9 return 0; 10 } 11 int main() 12 { 13 for(int i=15;i<19;i++){ 14 for(int j=0;j<10;j++){ 15 a[i][j]=1; 16 } 17 } 18 int n,temp=0; 19 for(int i=0;i<15;i++) 20 { 21 for(int j=0;j<10;j++) 22 { 23 scanf("%d",&a[i][j]); 24 } 25 } 26 for(int i=0;i<4;i++) 27 { 28 for(int j=0;j<4;j++) 29 { 30 scanf("%d",&b[i][j]); 31 } 32 } 33 scanf("%d",&n); 34 int mark; 35 36 for(int i=0;i<=14;i++) 37 { 38 if(compareBlock(i,n-1)) break; 39 mark=i; 40 } 41 for(int i=0;i<4;i++){ 42 for(int j=0;j<4;j++){ 43 if(b[i][j]==1) a[mark+i][n-1+j]=1; 44 } 45 } 46 for(int i=0;i<15;i++){ 47 for(int j=0;j<10;j++){ 48 printf("%d ",a[i][j]); 49 } 50 printf("\n"); 51 } 52 return 0; 53 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:1475 m进制转十进制
- L1-015 跟奥巴马一起画方块 (15分) 2020-03-31
- 【CSP-S膜你考】那23个路口 2019-10-25
- CSP(noip)中的简单对拍写法 2019-10-25
- 【CSP-S膜你考】 A 2019-10-17
- 【CSP-S膜你考】即时战略(模拟) 2019-10-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash