4.3西山居笔试题编程题
两题都AC了,老费力了,由于前面很拉,所以这里我尽力做到了全A,希望能进面吧
顺便分享一下本地的代码:
编程题1:
剑指offer中等难度原题,动态规划的,很简单不说了
编程题2:
开心消消乐咯,找一次能消除最多方块的位置进行消除,直到消除完需要多少步,每一步是那个位置;
(近百行代码用模拟暴力做的,实在不知道怎么优化)
/*
m*n个方格
0 表示无方块, 1表示有方块
指定x,y位置消除这一行一列
每次指定最多可消除的位置,并求多少次能消除完
输出多少步
3 4
0 1 0 0
0 1 0 1
0 1 1 1
输出消除位置x,y;
2
3,2
2,4
*/
#include <bits/stdc++.h>
using namespace std;
int m = 0, n = 0;//棋盘宽高
int maxi = 0, maxj = 0;//消除最多方块的位置
int res[100][100];//存储每次消除方块的位置
bool a[100][100];//存储棋盘
int b[100][100];//存储对应位置的最大可消除方块数量
//计算当前方块可消除数
int f(int x, int y){
int ans = 0;
for(int i = 1; i <= n; i++){
if(a[x][i]) ans++;
}
for(int i = 1; i <= m; i++){
if(a[i][y]) ans++;
}
return ans;
}
//计算是否消除完毕 , true 表示还有, false 表示没了
bool isT(){
bool flag = false;
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(a[i][j]){
flag = true;
}
}
}
return flag;
}
int main(){
cin>>m>>n;
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
cin>>a[i][j];
for(int i = 0; i < 100; i++){
for(int j = 0; j < 100; j++){
res[i][j] = 0;
b[i][j] = 0;
}
}
//计算消除最多的方块的位置,并消除 后把ans +1
int k = 0, retans = 0;
while(isT()){
int maxnum = 0;
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(a[i][j]){
b[i][j] = f(i, j);
if(b[i][j] > maxnum){
maxnum = b[i][j];
maxi = i;
maxj = j;
}
}
}
}
res[k][0] = maxi;
res[k][1] = maxj;
k++;
for(int i = 1; i <= n; i++)
if(a[maxi][i]) a[maxi][i] = 0;
for(int i = 1; i <= m; i++)
if(a[i][maxj]) a[i][maxj] = 0;
retans++;
}
cout<<retans<<endl;
for(int i = 0; i < 100; i++){
if(res[i][0] != 0 || res[i][1] != 0){
cout<< res[i][0] << "," << res[i][1] << endl;
} else if(res[i][0] == 0 || res[i][1] == 0) break;
}
return 0;
}
#我的实习求职记录##互联网没坑了,还能去哪里?##我的求职思考##如何判断面试是否凉了##在找工作求抱抱#
查看10道真题和解析