CCF 201604-2 俄罗斯方块
话不多说,直接上100分代码:
#include<iostream> using namespace std; struct { int x,y; } pos[4]; int page[21][10]; int block[4][4]; int Index = 0; int n,final = 20; int main() { for(int i = 0 ; i < 15; i++) { for(int j = 0 ; j < 10 ; j++) { cin >> page[i][j]; } } for(int i = 15 ; i < 20; i++) {//将下面四行的内容都变为1 for(int j = 0 ; j < 10 ; j++) { page[i][j] = 1; } } for(int i = 0 ; i < 4 ; i++) { for(int j = 0 ; j < 4 ; j++) { cin >> block[i][j]; if(block[i][j] == 1) { pos[Index].x = 3-i; pos[Index].y = j; Index++; } } } cin >> n; n = n-1; for(int i = 4 ; i < 20 ; i++) {//找到应该放的位置 for(int j = 0 ; j < 4 ; j++) { if(page[i - pos[3-j].x][n + pos[3-j].y] == 1) { final = i-1; goto L1; } } } L1: for(int j = 0 ; j < 4 ; j++) {//替换page中的相应位置的数字 page[final - pos[j].x][n + pos[j].y] = 1; } for(int i = 0 ; i < 15; i++) {//打印出结果 for(int j = 0 ; j < 10 ; j++) { cout << page[i][j] << ' '; } cout << endl; } }
这题稍微打的有点久,主要是有的方面没想到:
1.第一次提交的时候得了40分,第一次的想法是从下往上判断合适的位置,当出现如下情况时输出就不对了。
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 1 1 1 1 1 1 1 1 1
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
2.改变了策略,从上往下判断位置,得了80分,很恼火,想了半天还有什么情况没有考虑到。发现这样一种情况:
如果给出的板块的图案中是这两种不同情况,则结果不一样了。
1 0 0 0 0 0 0 0
1 0 0 0 1 0 0 0
1 0 0 0 1 1 1 0
1 0 0 0 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。于是我在最下面放了4行 ‘1’
最终花了2个小时才搞定(😓)
更气人的是,如下代码:
struct { int x,y; } pos[4]; int page[16][10]; int block[4][4]; int n,index = 0,final = 20; int main() { for(int i = 0 ; i < 15; i++) { for(int j = 0 ; j < 10 ; j++) { cin >> page[i][j]; } } for(int i = 15 ; i < 20; i++) { for(int j = 0 ; j < 10 ; j++) { page[i][j] = 1; } } for(int i = 0 ; i < 4 ; i++) { for(int j = 0 ; j < 4 ; j++) { cin >> block[i][j]; if(block[i][j] == 1) { pos[index].x = 3-i; pos[index].y = j; index++; } } }
这个前半部分是有问题的:如果Debug会发现,当第一次记录pos时index的值是1而不是0。
原因是:nm数组越界了(定义的时候开小了),而C/C++在GCC编译下是没有越界检查的(计算机基础的知识还给老师了),这造成程序修改了不属于page数组地址空间的内容,导致了index = 1,又花了半天找这个问题!
当然也可以在需要index的时候定义,就不会出现这个问题了。
int index = 0; for(int i = 0 ; i < 4 ; i++) { for(int j = 0 ; j < 4 ; j++) { cin >> block[i][j]; if(block[i][j] == 1) { pos[index].x = 3-i; pos[index].y = j; index++; } } }
所以数组一定要保证不越界啊啊啊啊啊啊啊啊!!!!!!!!

浙公网安备 33010602011771号