開始將題目理解成了,開始的列應該是從輸入圖案的最左端開始計算,將前面所有的空列都刪掉,代碼如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
const int M = 1e5+10;
int a[20][20];
int b[5][5];int main(){for(int i = 0 ; i < 15 ; i++){for(int j = 0 ; j < 10 ; j++){cin >> a[i][j];}}for(int i = 0 ; i < 4 ; i++){for(int j = 0 ; j < 4 ; j++){cin >> b[i][j];}}int k;cin >> k;int flag = 0;int res = 0;for(int i = 0 ; i < 4 ; i++){for(int j = 0 ; j < 4 ; j++){if(b[j][i] == 1){flag = 1;res = i;break;}}if(flag == 1){break;}}vector<vector<int>> c(4,vector<int>(2,0));int num = 0;for(int i = 0 ; i < 4 ; i++){for(int j = res ; j < 4 ; j++){if(b[i][j] == 1){c[num][0] = i;c[num][1] = k + j - res;num++;}}}int xd = 0;for(int i = 1 ; i < 18 ; i++){if(c[0][0]+i < 15 && c[1][0]+i < 15 && c[2][0]+i < 15 && c[3][0]+i < 15 && a[c[0][0]+i][c[0][1]] == 0 && a[c[1][0]+i][c[1][1]] == 0 && a[c[2][0]+i][c[2][1]] == 0 && a[c[3][0]+i][c[3][1]] == 0){xd++;}else{break;}}for(int i = 0 ; i < 4 ; i++){a[c[i][0]+xd][c[i][1]] = 1;}for(int i = 0 ; i < 15 ; i++){for(int j = 0 ; j < 10 ; j++){cout << a[i][j] << " ";}cout << endl;}return 0;
}
結果只拿到了60分。
仔細看題,題目里寫的是,只刪除最左端的列,也就是說不管圖案在哪里,都只刪除最左端的一列。比如說輸入的圖案是
0 0 0 1
0 0 0 1
0 0 0 1
0 0 0 1
,也只刪除最左列,即從第k列開始放的圖案是
0 0 1
0 0 1
0 0 1
0 0 1,
得到的圖案是這樣的:
逆天了,我只能說CSP的出題人完全不靠譜
100分代碼:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10;
const int M = 1e5+10;
int a[20][20];
int b[5][5];int main(){for(int i = 0 ; i < 15 ; i++){for(int j = 0 ; j < 10 ; j++){cin >> a[i][j];}}int num = 0;vector<vector<int>> c(4,vector<int>(2,0));for(int i = 0 ; i < 4 ; i++){for(int j = 0 ; j < 4 ; j++){cin >> b[i][j];if(b[i][j] == 1){c[num][0] = i;c[num][1] = j;num++;}}}int k;cin >> k;for(int i = 0 ; i < 4 ; i++){c[i][1] += k - 1;}int xd = 0;for(int i = 1 ; i < 18 ; i++){if(c[0][0]+i < 15 && c[1][0]+i < 15 && c[2][0]+i < 15 && c[3][0]+i < 15 && a[c[0][0]+i][c[0][1]] == 0 && a[c[1][0]+i][c[1][1]] == 0 && a[c[2][0]+i][c[2][1]] == 0 && a[c[3][0]+i][c[3][1]] == 0){xd++;}else{break;}}for(int i = 0 ; i < 4 ; i++){a[c[i][0]+xd][c[i][1]] = 1;}for(int i = 0 ; i < 15 ; i++){for(int j = 0 ; j < 10 ; j++){cout << a[i][j] << " ";}cout << endl;}return 0;
}