P2067 Cytus-Holyknight
题目背景
本人最初作
以此纪念伟大的ios、安卓、PSV平台音乐游戏《cytus》
后续将不断更新。
-------------Chapter V-1-------------
话说两位战士整天靠在一起好无聊啊,于是她们打算——玩游戏!(?)
她们就用剑画了一个十字架,然后开始抛石子,好好玩啊(???)
两个人每人有一个石子,当她们丢完后,正在自学数学的小蓝大叫:把他们连起来不就是一次函数吗!!
于是乎,她们就连了起来,然后她们开始计算。此时她们发现一个严重的问题——没有草稿纸!(这什么破问题= =)
由于脑补能力太低,她们只好让你来帮帮忙啦~
题目描述
给出图形(十字架可以视为x轴和y轴),请计算出函数解析式。
输入输出格式
输入格式:
第一行,一个正整数n,表示该图形大小是n*n;
接下来n行,每行n个字符,1表示坐标轴,x表示石子,0表示空地。
横行的1是x轴,竖列的1是y轴。
上下两行,左右两列的距离恒为1。
输出格式:
输出一行,即y=kx+b,或y=kx,y=b,x=b;(k,b为常数)
常数始终保留四位小数
输入输出样例
说明
切记要分类
数据不需判错
100%的数据,3<=n<=16(够水吧)
没学过函数的自己百度
求一次函数解析式
考虑多种情况:
1.x、y在坐标轴上的情况,并且是坐标轴无法判断的情况
2.两个点的x值相等的情况
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; double k,b; char ch[20][20]; int n,s,x[3],y[3],xx[20],yy[20]; double read() { double x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f; } int main() { n=read(); for(int i=1;i<=n;i++) { cin>>ch[i]; for(int j=0;j<n;j++) if(ch[i][j]=='1') { if(xx[i]) y[0]=i; if(yy[j]) x[0]=j; xx[i]++,yy[j]++; } } for(int i=1;i<=n;i++) for(int j=0;j<n;j++) if(ch[i][j]=='x') y[++s]=y[0]-i,x[s]=j-x[0]; if(xx[y[0]]==1) {printf("y=%.4lf",b);return 0;} if(yy[x[0]]==1) {printf("x=%.4lf",k);return 0;} if(x[1]==x[2]) {printf("x=%.4lf",x[1]);return 0;} k=1.0*(y[1]-y[2])/(x[1]-x[2]); b=(double)y[1]-k*x[1]; //if(k<0&&b<0||k<0&&b>0) k=-k,b=-b; if(k==0) printf("y=%.4lf",b); else { printf("y=%.4lfx",k); if(b==0) return 0; if(b>0) printf("+"); printf("%.4lf",b); } return 0; }