洛谷 P2067 Cytus-Holyknight

洛谷 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;

// 用两个连续的 1 来判断 X 和 Y 轴
// 如过有石子落在坐标轴上会出现问题,所以,用两遍循环,取消石子的影响 

int main(){
	char map[17][17];
	int i1 = 0,i2 = 0,j1 = 0,j2 = 0;//两个 x 的横纵坐标 ij 坐标体系
	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;
				}
				
			}
			//if(map[i][j] == '1' && map[i-1][j] == '1') Y = j;//纵坐标轴 
			//if(map[i][j] == '1' && map[i][j-1] == '1') X = i;//橫坐标轴 
		}
	} 
	// 用两个连续的 1 来判断 X 和 Y 轴
	// 如果有石子落在坐标轴上会出现问题,所以,用两遍循环,取消石子的影响 
	for(int i=1;i<=n;i++){
		int fflag = 0; 
		for(int j=1;j<=n;j++){//如果有一行有两个  1 就把这一行全变成 1 
			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++){//如果有一列有两个  1 就把这一列全变成 1 
			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;//根据 ij 坐标系 和 XY 坐标系的关系,求出两个点在 XY 坐标系中的坐标 
	x2 = j2 - Y;//画图理解 
	y1 = X - i1;
	y2 = X - i2;
	double b,a;//函数的系数 
	if(y1 == y2){//图像平行于 X 轴 
		printf("y=%.4lf\n",y1);
	}
	else if(x1 == x2){//图像平行于 Y 轴 
		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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值