题解 P1056 【排座椅】

· · 题解

我写了个对拍(大佬请避开)。

(这洛谷真叼,把我逼急了。写了对拍来看自己程序的BUG,为啥只能下一次数据还只能下第一WA)。

首先这道题我还没AC,气死我了,一定是数据坑卡掉了我的快拍(好吧其实我不会用快拍。。)。

为啥洛谷非要解释不能光要注释啊。。。算了。

神奇的生成数据

1:把题意反过来看,譬如给一个(2<=N,M<=2000),你就创建一个这样的数据就O了。

2:生成数据时同时满足题目条件,譬如保证两个人相邻(虽然关于图论生成数据我不会。。。。。。。(;´д`)ゞ)。

//生成数据代码
//试试自己生成数据
//第一次,难免会坑死。题又不对套。。。。。。
//酱油酱的成长路。。。。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<iostream>
int main()
{
//    freopen("data.in","w",stdout);
    srand((unsigned)time(0));
    int M,N,K,L,D;
    D=rand()%(1999-20+1)+20;
    M=rand()%(1999-20+1)+20;
    N=rand()%(1999-20+1)+20;
    K=rand()%(M-30)+20;
    L=rand()%(N-30)+20;
    printf("%d %d %d %d %d\n",M,N,K,L,D);
    for(int i=1;i<=D;i++)
    {
        int j=rand()%100;
        int j2=rand()%2;
        int x=rand()%(M-20+1)+20;
        int y=rand()%(N-20+1)+20; 
        if(49>=j)//修改与j的比较值可以更改出横向还是纵向的组数多少
        {/*横定竖动*/
            int py=j>24?y-1:y+1; 
            if(!j2)printf("%d %d %d %d\n",x,y,x,py);//模拟样例中第三组人数据的坑
            else printf("%d %d %d %d\n",x,py,x,y);
        }
        else 
        {/*竖定横动*/
            int px=j>74?x-1:x+1;
            if(!j2)printf("%d %d %d %d\n",x,y,px,y);//模拟样例中第三组人数据的坑
            else printf("%d %d %d %d\n",px,y,x,y);
        }
    }
}

神奇的对拍

1:不会,看不懂?背吧。

2:注意文件的后缀名,以及文件名是你自己的。

3:注意头文件<windows.h>

上代码:

//windows 下手写对拍;
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
    while(1)
    {
        system("data.exe>data.in");//生成数据丢进去 
        system("std.exe<data.in>std.out");//生成后丢进标程 
        system("myprogram.exe<data.in>my.out");//使劲把数据擩进去//自己的程序 
        if(system("fc std.out my.out"))// 注意空格,fc是比较标志,有误返回1
        {
            system("pause");
            printf("圣柠檬数据卡掉了我\n");//这时就可以去检查data.in了看看是啥卡掉了我
            //break; 
        }
    }
}

以上是洛谷把我逼急了的结果。我就笑笑 ̄へ ̄。