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++;
            }
        }
    }

所以数组一定要保证不越界啊啊啊啊啊啊啊啊!!!!!!!!

posted @ 2022-03-25 15:48  夏莱发电厂的Sensei  阅读(42)  评论(0)    收藏  举报