1 条题解

  • 0
    @ 2025-8-24 21:33:36

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 老彩笔
    鱼对水说你看不到我的眼泪,因为我在水里。水说我能感觉到你的眼泪,因为你在我心里。

    搬运于2025-08-24 21:33:36,当前版本为作者最后更新于2019-09-08 16:16:24,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这题不好处理的地方就在如何判断x轴和y轴的位置,因为情况很多:

    1.两个石子(即两个点)的位置没有覆盖坐标轴

    1. 两个石子里有一个覆盖了坐标轴

    3.两个石子里有两个覆盖了坐标轴

    ………

    开始我想用两个连续的1来判断:

    	if(c[i][j]=='1'&&c[i][j-1]=='1')xz=i;
    	if(c[i][j]=='1'&&c[i-1][j]=='1')yz=j;
    

    然后发现他死了,下面这种情况就不能判断了:

    0x0
    1x1
    010
    

    然后我改了一下,我想用一个1加一个0来判断:

    	if(c[i][j]=='1'&&c[i-1][j]=='0')xz=i;
    	if(c[i][j]=='1'&&c[i][j-1]=='0')yz=j;
    

    然后他又死了,下面这种情况就死了:

    x000000
    x111111
    1000000
    1000000
    1000000
    1000000
    1000000
    

    最后改进了一下,让他即判断左边,还判断右边,就A了:

    	if(!c1&&c[i][j]=='1'&&c[i-1][j]=='0')xz=i,c1=1;//加上两个bool判断防止重复修改
    	if(!c2&&c[i][j]=='1'&&c[i][j-1]=='0')yz=j,c2=1;
    	if(!c1&&c[i][j]=='0'&&c[i-1][j]=='1')xz=i-1,c1=1;
    	if(!c2&&c[i][j]=='0'&&c[i][j-1]=='1')yz=j-1,c2=1;
    

    输出函数的时候还需要特判两个常函数:

    1.如果两个点x坐标相等那么输出x=b;

    2.如果两个点y坐标相等那么输出y=b;

    3.其他输出y=kx+b;

    下面是代码,里面有解释:

    #include<bits/stdc++.h>
    using namespace std;
    inline int read()
    {
    	int 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-48+ch;ch=getchar();}
    	return x*f;
    }
    const int maxn=105;
    char c[maxn][maxn];
    int n,xz,yz;//xz是x轴,yz是y轴 
    double xl,xr,yl,yr;
    bool jd1;//记录是否已经找到了1个点
    bool c1,c2;//分别记录是否找到了x轴和y轴 
    int main()
    {
    	n=read();
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			cin>>c[i][j];
    			if(!c1&&c[i][j]=='1'&&c[i-1][j]=='0')xz=i,c1=1;//x轴 
    			if(!c2&&c[i][j]=='1'&&c[i][j-1]=='0')yz=j,c2=1;//y轴 
    			if(!c1&&c[i][j]=='0'&&c[i-1][j]=='1')xz=i-1,c1=1;//x轴 
    			if(!c2&&c[i][j]=='0'&&c[i][j-1]=='1')yz=j-1,c2=1;//y轴 
    			if(c[i][j]=='x')//找到了石子 
    			{
    				//如果不用一个bool变量记录也可以用数组来保存 
    				if(!jd1)//如果没有找到了第一个石子 
    				{	
    					xl=j;
    					yl=i;
    					jd1=1;
    				}
    				else //如果已经找到了第一个石子就记录第二个 
    				{
    					xr=j;
    					yr=i;
    				}
    			}
    		}
    	}
    	//因为上面只记录了在数组里面的位置
    	//这里要处理出实际位置
    	//若有不懂大家可以手模一下 
    	xl-=yz;
    	xr-=yz;
    	yl=xz-yl;
    	yr=xz-yr;
    	//下面是分情况讨论 
    	if(xl==xr)
    	{
    		cout<<"x=";
    		printf("%.4lf\n",xl);
    		return 0;
    	}
    	double k,b;
    	k=(yr-yl)/(xr-xl);
    	cout<<"y=";
    	if(k!=0)printf("%.4lfx",k);
    	else
    	{
    		printf("%.4lf\n",yl);
    		return 0;
    	}
    	b=yl-k*xl;
    	if(b>0)cout<<'+';//如果b小于0就不用输出+ 
    	if(b!=0)printf("%.4lf\n",b);
    	//如果b等于0就什么也不做 
    	return 0;
     } 
    
    • 1

    信息

    ID
    1032
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者