题目描述
第一题:产品经理转程序员
c++版代码
测试用例可以通过
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int n=0; //修改次数
int alter(int A[10][10],int temp[10][10]){ //一次修改
bool isAlter=false,isNoOne=true; //该次是否有修改;是否全部修改好了
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(temp[i][j]==-1){ //修改修改他的四个方向
if(j-1>=0&&A[i][j-1]==1){ //左
A[i][j-1]=2;
isAlter=true;
}
if(j+1<=10&&A[i][j+1]==1){ //右
A[i][j+1]=2;
isAlter=true;
}
if(i-1>=0&&A[i-1][j]==1){ //上
A[i-1][j]=2;
isAlter=true;
}
if(i+1<=10&&A[i+1][j]==1){ //下
A[i+1][j]=2;
isAlter=true;
}
}
if(A[i][j]==1) //还存在没被修改的
isNoOne=false;
}
}
if(!isAlter){
if(isNoOne)
return n;
else
return -1;
}else{
n++;
return -2; //没有得到最终结果,还要继续修改
}
}
void getTemp(int temp[10][10],int A[10][10]){ //得到下一次要修改的中心
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
temp[i][j]=0;
if(A[i][j]==2)
temp[i][j]=-1;
}
}
}
int main() {
string str; //暂存一行数据
vector<string> matrix; //暂存多行数据
while(getline(cin,str)){
if(str.size()==0)
break;
matrix.push_back(str);
}
int A[10][10]={0}; //数据矩阵
int temp[10][10]={0}; //下一次要修改的中心
int i=-1,j;
for(vector<string>::iterator it = matrix.begin();it != matrix.end();it++){
i++;
j=0;
for(int k=0;k<(*it).size();k+=2){
A[i][j]=(*it)[k]-'0';
if(A[i][j]==2)
temp[i][j]=-1; //修改中心标记为-1
j++;
}
}
int result=alter(A,temp);
while(result==-2){
getTemp(temp,A);
result=alter(A,temp);
}
cout<<result;
return 0;
}