题目描述:
臭名昭著的罪犯ss犯下的三项大胆罪行震撼了HFUU。
HFUU的地图由n×m的矩形表表示。地图上表格的每个单元格代表首都的某些地区。
HFUU的侦探zx绘制了地图,并在其中标出了前三起抢劫案中标有星号的地区。
zx经过推导后发现,第四起抢劫案将在该地区进行,并且将所有四个抢劫区连起来将形成一个矩形。
zx擅长演绎,但数学无望。因此,他要求您找到将要进行第四次抢劫的地区
输入要求有:
第一行输入n,m来代表地图上的行和列
用“ . ”来表示未被抢劫
用“ * ”来表示已被抢劫
输出要求:
输出:
如果可以构成矩形,则输出下一次要抢劫的坐标
如果不行就输出“-1”
思路:
用二维字符串来读取相应的地图
用getchar()来消去回车的影响
然后用for循环嵌套来判断数组的值是否为“*”
并且记录三个点的坐标
for(i=0;i<n;i++){
for(j=0;j<m;j++){
if(arr[i][j]=='*'){
if(temp==0){
temp1=i+1;//x1
temp2=j+1;//y1
temp++;
}else if(temp==1){
temp3=i+1;//x2
temp4=j+1;//y2
temp++;
}else if(temp==2){
temp5=i+1;//x3
temp6=j+1;//y3
}
}
}
}
此时只需用判断第四个“ * ”的位置即可
根据题意,此时应当判断是否存在“ * ” 点能在此数组里形成矩形,来判断输出 -1 的情况
即当有两个点的横坐标相等,有两个纵坐标相等时,保证形成一个直角,所以能形成一个矩形。反之输出 -1 ,即不能形成题目所需的矩形。
实现代码如下
int sum1=temp1-temp3;//x1-x2
int sum2=temp2-temp4;//y1-y2
int sum3=temp3-temp5;//x2-x3
int sum4=temp5-temp1;//x3-x1
int sum5=temp6-temp2;//y3-y1
int sum6=temp4-temp6;//y2-y3
//此处应注意数据类型,否则数据过大时会爆int
if( sum1 * sum3 * sum4 + sum2 * sum5 * sum6 != 0){
printf (" -1 ");
}
在此时分成四种情况来判断第四点的坐标
直接上代码
if((temp1==temp3&&temp2==temp4)||temp1==temp4&&temp2==temp4))
printf("%d %d",temp3+temp5-temp1,temp4+temp6-temp2);
else if((temp3==temp1&&temp4==temp6)||(temp3==temp5&&temp4==temp2))
printf("%d %d",temp1+temp5-temp3,temp2+temp6-temp4);
else if((temp5==temp1&&temp6==temp4)||(temp5==temp3&&temp6==temp2))
printf("%d %d",temp1+temp3-temp5,temp2+temp4-temp6);
else
printf("-1");
就能得出结果