洛谷 P2067 Cytus-Holyknight
题目链接
需要注意的是石子可能会落在坐标轴上。如果单纯只用两个连续的 1 来识别坐标轴会出现问题。
解决方法是在 get 石子的坐标之后,将有两个 1 所在的那行或者那列全部置为 1 。简单粗暴嘻嘻。
需要分行和列分别设置两遍 1 。
题目中涉及到两个坐标系。一个是用二维数组输入数据时自然存在的 ij 坐标系,一个是由输入的 1 决定的XY 坐标系,画图可以清楚看出他们之间的关系。
将 ij 坐标系转换成 XY 坐标系后就可以根据一次函数解析式求出系数和常量啦。
最后还需要考虑函数图像平行坐标轴的情况,以及函数图像过原点的情况,用 if 语句做个判断就可以啦。
最最后,输出控制四位小数,C语言对 float 型的就是 %.4f 。 double 型的就是 %.4lf 。
#include<bits/stdc++.h>
using namespace std;
int main(){
char map[17][17];
int i1 = 0,i2 = 0,j1 = 0,j2 = 0;
double x1 = 0,x2 = 0,y1 = 0,y2 = 0;
int flag = 0;
int X,Y;
int n;
cin>>n;
int k = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>map[i][j];
if(map[i][j]=='x'){
if(flag == 0){
i1 = i;
j1 = j;
flag = 1;
}
else{
i2 = i;
j2 = j;
}
}
}
}
for(int i=1;i<=n;i++){
int fflag = 0;
for(int j=1;j<=n;j++){
if(map[i][j]=='1') fflag++;
if(fflag==2){
for(k=1;k<=n;k++){
map[i][k] = '1';
}
}
}
}
for(int i=1;i<=n;i++){
int fflag = 0;
for(int j=1;j<=n;j++){
if(map[j][i]=='1') fflag++;
if(fflag==2){
for(k=1;k<=n;k++){
map[k][i] = '1';
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(map[i][j] == '1' && map[i-1][j] == '1') Y = j;
if(map[i][j] == '1' && map[i][j-1] == '1') X = i;
}
}
x1 = j1 - Y;
x2 = j2 - Y;
y1 = X - i1;
y2 = X - i2;
double b,a;
if(y1 == y2){
printf("y=%.4lf\n",y1);
}
else if(x1 == x2){
printf("x=%.4lf\n",x1);
}
else{
double a = (y2 - y1) / (x2 - x1);
double b = y1 - a * x1;
if(b>0){
printf("y=%.4lfx+%.4lf\n",a,b);
}
else if(b == 0){
printf("y=%.4lfx\n",a);
}
else{
printf("y=%.4lfx%.4lf\n",a,b);
}
}
return 0;
}