皮皮网

【飞艇最快开源码】【影之刃3源码】【手机应用介绍源码】poj源码

来源:eclipse看c源码 时间:2024-11-23 13:05:33

1.写出下面题目的程序代码(C++) 并且输入输出都截个 谢谢~
2.poj 3278
3.如何建立online judge系统

poj源码

写出下面题目的程序代码(C++) 并且输入输出都截个 谢谢~

       //记的以前学校时写过,好像是飞艇最快开源码POJ的题目。源代码还在电脑上留着,影之刃3源码仅供参考

       #include <iostream>

       #include <cmath>

       using namespace std;

       const int MAXN = ;

       const int MAXM = ;

       const int MAXP = ;

       const int MAXT = 6;

       struct Tpoint {

        int x,手机应用介绍源码 y;

       };

       Tpoint u[MAXN],v[MAXN],w[MAXN],p[MAXN];

       int step[4][2] = { { 0,1}, { 0,-1}, { 1,0}, { -1,0}};

       int mark[MAXM][MAXM], map[MAXP][MAXP], board[MAXT][MAXT];

       int num, cnt, ver, size;

       bool cover[MAXM][MAXM];

       char line[MAXM][MAXM];

       //判断B集合中的连通性

       inline int connect(int x, int y)

       {

        int front = 0, rear = 1;

        w[rear].x = x; w[rear].y = y; board[x][y] = 0;

        while(front < rear) {

        front ++;

        for(int i = 0; i < 4; i ++) {

        int tx = w[front].x + step[i][0];

        int ty = w[front].y + step[i][1];

        if(tx >= 0 && tx < size && ty >= 0 && ty < size && board[tx][ty]) {

        board[tx][ty] = 0;

        rear++;

        w[rear].x = tx;

        w[rear].y = ty;

        }

        }

        }

        return rear;

       }

       //通过平移判断两个集合是否刚好构成N*N的图形

       inline bool match(int minx2, int miny2, int maxx2, int maxy2, int maxx1, int maxy1)

       {

        for(int i = maxx2 - size + 1; i < minx2 + size - maxx1; i ++) {

        for(int j = maxy2 - size + 1; j < miny2 + size - maxy1; j ++) {

        bool flag = true;

        for(int k = 0; k < num; k ++) {

        if(map[v[k].x+i][v[k].y+j]) {

        flag = false;

        break;

        }

        }

        if(flag) return true; //集合A和集合B刚好能组成size*size的正方形,返回true;

        }

        }

        return false;

       }

       inline bool ok(int minx2,linuxqt源码编译xcb int miny2, int maxx2, int maxy2) //参数传递集合A的边界

       {

        int i, j, minx1, miny1, maxx1, maxy1;

        minx1 = miny1 = ; maxx1 = maxy1 = 0;

        for(i = 0; i < ver; i ++) {

        if(! cover[p[i].x][p[i].y]) { //标记集合B的边界

        if(minx1 > p[i].x) minx1 = p[i].x;

        if(miny1 > p[i].y) miny1 = p[i].y;

        if(maxx1 < p[i].x) maxx1 = p[i].x;

        if(maxy1 < p[i].y) maxy1 = p[i].y;

        }

        }

        num = 0;

        memset(map, 0, sizeof(map));

        for(i = 0; i < ver; i ++) {

        if(! cover[p[i].x][p[i].y]) {

        if((p[i].x - minx1 >= size) || (p[i].y - miny1 >= size))

        return false;

        //集合B的边界超过size*size,返回false

        v[num].x = p[i].x - minx1; //将集合B往左上角移

        v[num].y = p[i].y - miny1;

        num ++;

        }else {

        map[p[i].x - minx2 + 5][p[i].y - miny2 + 5]=1; //将集合A往右下角移

        }

        }

        memset(board,e站源码分享 0, sizeof(board));

        for(i = 0; i < num; i ++)

        board[v[i].x][v[i].y] = 1;

        if(connect(v[0].x,v[0].y)<num) return false; //集合B不连通返回false

        maxx2 = maxx2 - minx2 + 5; maxy2 = maxy2 - miny2 + 5;

        minx2 = miny2 = 5;

        maxx1 = maxx1 - minx1; maxy1 = maxy1 - miny1;

        minx1 = miny1 = 0;

        for(i = 0; i < 4; i ++) { //4次旋转

        if(match(minx2, miny2, maxx2, maxy2, maxx1, maxy1))

        //集合A与B刚好能够组成size*size的正方形,返回true

        return true;

        minx1 = miny1 = INT_MAX; maxx1 = maxy1 = INT_MIN;

        for(j = 0; j < num; j ++) {

        int temp = v[j].y;

        v[j].y = size - v[j].x - 1;

        v[j].x = temp;

        if(minx1 > v[j].x) minx1 = v[j].x;

        if(miny1 > v[j].y) miny1 = v[j].y;

        if(maxx1 < v[j].x) maxx1 = v[j].x;

        if(maxy1 < v[j].y) maxy1 = v[j].y;

        }

        for(j = 0; j < num; j ++) {

        v[j].x -= minx1; v[j].y -= miny1; //将集合B往左上角移

        }

        maxx1 -= minx1;maxy1 -= miny1;

        }

        return false;

       }

       inline bool dfs(int minx, int miny, int maxx, int maxy, int m, int k)

       {

        if(k > m) return false;

        if(dfs(minx, miny, maxx, maxy, m, k + 1)) return true; //k点不属于集合A

        if(abs(u[k].x - minx) >= size || abs(u[k].y - miny) >= size ||

        abs(u[k].x - maxx) >= size || abs(u[k].y - maxy) >= size)

        //若集合A超过边界size,则返回false

        return false;

        int i, tx, ty;

        for(i = 0; i < 4; i ++) {

        tx = u[k].x + step[i][0];

        ty = u[k].y + step[i][1];

        if(line[tx][ty] == '*' && ! mark[tx][ty]) { //可扩展点进行标记

        m ++;

        u[m].x = tx;

        u[m].y = ty;

        mark[tx][ty] = k;

        }

        }

        cover[u[k].x][u[k].y] = true;

        if(ok(__min(minx, u[k].x), __min(miny, u[k].y), __max(maxx, u[k].x), __max(maxy, u[k].y)))

        //若刚好能组成size*size的正方形,则返回true

        return true;

        if(dfs(__min(minx, u[k].x), __min(miny, u[k].y), __max(maxx, u[k].x), __max(maxy,u[k].y), m, k + 1))//继续搜索集合A,若成功返回true

        return true;

        cover[u[k].x][u[k].y] = false;

        for(i = 0; i < 4; i ++) {

        tx = u[k].x + step[i][0];

        ty = u[k].y + step[i][1];

        if(mark[tx][ty] == k) mark[tx][ty] = 0; //消除标记

        }

        return false;

       }

       int main()

       {

        cnt = 0;

        while(gets(line[cnt++])); //读入数据

        ver = 0;

        for(int i = 0; i < cnt; i ++)

        for(int j = 0; line[i][j]; j ++)

        if(line[i][j] == '*') {

        p[ver].x = i; p[ver].y = j; ver ++;

        }

        size = (int)sqrt((double)ver); //正方形的边长为size

        memset(cover, false, sizeof(cover));

        memset(mark, 0, sizeof(mark));

        u[1].x = p[0].x; u[1].y = p[0].y;

        mark[u[1].x][u[1].y] = -1;

        dfs(u[1].x, u[1].y, u[1].x, u[1].y, 1, 1); //搜索集合A的可能情况

        for(i = 0; i < cnt; i ++) {

        for(int j = 0; line[i][j]; j ++) {

        if(line[i][j]=='*') {

        if(cover[i][j]) printf("A");

        else printf("B");

        }else printf(".");

        }

        printf("\n");

        }

        return(0);

       }

poj

        Accepted K MS Pascal B -- ::

       æºä»£ç ï¼šä½ å¯ä»¥å…ˆæäº¤ä¸€æ¬¡è¯•è¯•ï¼Œè¿™æ˜¯AC的,不是囧的

       program p;

       var

        q,step:array[0..] of longint;

        visit:array[0..] of boolean;

        head,tail,n,k,maxn,tmp:longint;

       begin

        readln(n,k);

        if n>=k then writeln(n-k)

        else

        begin

        fillchar(visit,sizeof(visit),false);

        q[0]:=n; visit[n]:=true; step[0]:=0;

        head:=0; tail:=0; maxn:=k*2;

        while (head<=tail) do

        begin

        tmp:=q[head]*2;

        if (tmp<maxn) and (not visit[tmp]) then

        begin

        inc(tail); visit[tmp]:=true;

        q[tail]:=tmp; step[tail]:=step[head]+1;

        if (visit[k]) then break;

        end;

        tmp:=q[head]-1;

        if (tmp>=0) and (not visit[tmp]) then

        begin

        inc(tail); visit[tmp]:=true;

        q[tail]:=tmp; step[tail]:=step[head]+1;

        if (visit[k]) then break;

        end;

        tmp:=q[head]+1;

        if (tmp<maxn) and (not visit[tmp]) then

        begin

        inc(tail); visit[tmp]:=true;

        q[tail]:=tmp; step[tail]:=step[head]+1;

        if (visit[k]) then break;

        end;

        inc(head);

        end;

        writeln(step[tail]);

        end;

       end.

       æ–¹æ³•ï¼šä¸»è¦ç®—法是广度优先搜索。先讨论n和k,n大于等于k时,只能向后退或不用动,即直接输出结果;然后用广搜解决n小于k的情况,从n开始搜索,即每次向前一个位置,下一个位置,和当前2倍位置搜索,每次搜索到新的位置记录当前位置(q数组的作用)和走到当前位置所需步数(step数组的作用)并记录该点已经走过(visit数组的作用),搜索过的不用再搜,搜到k时输出结果并退出程序。注意的是Farmer John无需走到大于等于2*k的点,因为走到这样的点上还不如直接一直向前走的步数少。

       åˆšåƒå®Œé¥­ï¼Œèœä¸ªæ°´é¢˜ï¼Œè¿™é¢˜æ˜¯æ ‡å‡†çš„广搜题

       2年没用Pascal了...有点怀念从前了

       NOIP?NOI? 加油!!!

如何建立online judge系统

       è™šæ‹Ÿä¸»æœºåŠŸèƒ½æœ‰é™ï¼Œä¸å¯èƒ½è¿è¡Œonline judge系统:工作原理:用户提交程序源码--->Web网站服务器--->转发给用于编译运行评测用户程序的服务器--->将结果返回Web网站服务器-->返回给用户限制因素:1、硬件:(1)虚拟主机提供给用户(网站制作者)的权限极少!不能自主安装服务器端软件,无法构建评测平台。(2)评测服务器需要有很强的性能,否则无法满足多用户同时编译运行评测(虚拟主机不可能达到)。购买(租用)服务器费用昂贵2、软件:和建立网站相比,需要自己额外编写服务器间协调软件和评测程序。其编程能力及经验要求很高。