mapp

#define C4DROID 0

//#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <time.h>

#if !C4DROID
#include <windows.h>
#endif
//using namespace std;

int correct;
int fact[]= {1,1,2,6,24,120,720,5040,40320};

void swp(char &x,char &y) {
    char t=x;
    x=y;
    y=t;
}

char conv(char a) {
    if(a<4) return a;
    if(a==‘w‘) return 0;
    if(a==‘s‘) return 1;
    if(a==‘a‘) return 2;
    if(a==‘d‘) return 3;
    return -1;
}

class field {
public:
    char *f;
    int zr;
    field () {
        f=new char[9];
        for(int i=0; i<8; ++i) f[i]=i+1;
        f[zr=8]=0;
    }
    void mix(int hehe) {
        while(hehe--) {
            move(rand()&3);
        }
    }
    field (char* F,int Zr) {
        f=F;
        zr=Zr;
    }
    char& at(int x,int y) {
        return f[x+y*3];
    }
    void out() {
#if C4DROID
        clrscr();
#else
        SetConsoleCursorPosition(GetStdHandle(-11),(COORD) {
            0,0
        });
#endif
        printf("%d %d %d\n\n%d %d %d\n\n%d %d %d\n"
               ,f[0],f[1],f[2],f[3],f[4],f[5],f[6],f[7],f[8]);
    }
    bool up() {
        if(zr<3) return false;
        swp(f[zr],f[zr-3]);
        zr-=3;
        return true;
    }
    bool down() {
        if(zr>5) return false;
        swp(f[zr],f[zr+3]);
        zr+=3;
        return true;
    }
    bool left() {
        if(zr%3==0) return false;
        swp(f[zr],f[zr-1]);
        zr--;
        return true;
    }
    bool right() {
        if(zr%3==2) return false;
        swp(f[zr],f[zr+1]);
        zr++;
        return true;
    }
    bool move(char a) {
        switch(conv(a)) {
        case 0:
            return up();
        case 1:
            return down();
        case 2:
            return left();
        case 3:
            return right();
        default:
            return 0;
        }
        return 0;
    }
    bool good() {
        return f[0]==1&&f[1]==2&&f[2]==3&&f[3]==4&&f[4]==5&&
               f[5]==6&&f[6]==7&&f[7]==8;
    }
    field& operator =(const field &x) {
        for(int i=0; i<9; ++i) f[i]=x.f[i];
        zr=x.zr;
        return *this;
    }
};

class solution {
public:
    field s;
    char data[362880];/*181440 slots is ok,without1,2,5,6,9,10*/
    void change(const char *a,char v) {
        int r=0,i=9,j=0,c;
        while(j<8) {
            c=0;
            for(i=j; i<9; ++i) if(a[j]>a[i]) ++c;
            r=(r+c)*(8-j);
            ++j;
        }
        data[r]=v;
    }
    char& todata(const char* a) {
        int r=0,i=9,j=0,c;
        while(j<8) {
            c=0;
            for(i=j; i<9; ++i) if(a[j]>a[i]) ++c;
            r=(r+c)*(8-j);
            ++j;
        }
        return data[r];
    }
    char& todata(field a) {
        return todata(a.f);
    }
    void init() {
        field *a=new field[24047],*b=new field[24047],*t;
        for(int i=0; i<362880; ++i) data[i]=127;
        int asize=1,bsize=0,count=0,msz=1;
        field d;
        a[0]=d;
        change(d.f,0);
        getche();
        while(asize) {
            count++;
            bsize=0;
            for(int i=0; i<asize; ++i) {
                if((d=a[i]).up()&&todata(d)>count) {
                    b[bsize++]=d;
                    change(d.f,count);
                }

                if((d=a[i]).down()&&todata(d)>count) {
                    b[bsize++]=d;
                    change(d.f,count);
                }
                if((d=a[i]).left()&&todata(d)>count) {
                    b[bsize++]=d;
                    change(d.f,count);
                }
                if((d=a[i]).right()&&todata(d)>count) {
                    b[bsize++]=d;
                    change(d.f,count);
                }
            }
            t=a;
            a=b;
            b=t;
            asize=bsize;
            msz+=bsize;
        }
        //a[0].out();
        for(int i=0;i<100;++i) printf("%d %d\n",i,data[i]);
        getche();

    }
    void get(field o) {
        for(int i=0; i<9; ++i) s.f[i]=o.f[i];
        s.zr=o.zr;
    }
    void solve() {
        int count=todata(s);
        field d;
        while(count>0) {
            printf("%d",count);
            if(getche()==‘q‘) return;
            if((d=s).up()&&todata(d)<count) {
                s=d;
                s.out();
                count--;
            } else if((d=s).down()&&todata(d)<count) {
                s=d;
                s.out();
                count--;
            } else if((d=s).left()&&todata(d)<count) {
                s=d;
                s.out();
                count--;
            } else if((d=s).right()&&todata(d)<count) {
                s=d;
                s.out();
                count--;
            }
        }
    }
};

solution sol;

int main() {
    srand(time(NULL));
    sol.init();
    field a;
    correct=sol.todata(a.f);
    a.out();
    char op;
    while(op=getche()) {
        if(op==‘p‘) {
            sol.get(a);
            sol.solve();
            a=sol.s;
        }
        if(op==‘m‘) a.mix(666);
        a.move(op);
        a.out();
    }
}
时间: 2024-11-08 05:52:20

mapp的相关文章

第二次使用mapp. 数据结构是个好东西。。

度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如,如果一个人名字是 ACM,那么 AMC, CAM, MAC, MCA, 等也都是这个人的名字.在这个国家中,没有两个名字相同的人. 度熊想统计这个国家的人口数量,请帮助度熊设计一个程序,用来统计每一个人在之前被统计过多少次. Input 这里包括一组测试数据,第一行包含一个正整数NNN,接下来的NN

struts2 ,web.xml中配置为/*.action,运行报错Invalid &lt;url-pattern&gt; /*.action in filter mapp

首先,修改成: <filter-mapping>  <filter-name>struts2</filter-name>  <url-pattern>/*</url-pattern></filter-mapping> 是可以的. 引起此错误的原因如下: 这个对filter的基础知识的理解:容器只认 全名匹配,路径匹配,扩展名匹配./*.action  又是路径匹配,有时扩展名匹配. 容器没办法区分 解决方法:写*.action <

SMP和MAPP的区别

SMP(Symmetrical Multi-Processing),对称多处理系统,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构.它是相对非对称多处理技术而言的.应用十分广泛的并行技术.在这种架构中,一台电脑不再由单个CPU组成,而同时由多个处理器运行操作系统的单一复本,并共享内存和一台计算机的其他资源.虽然同时使用多个CPU,但是从管理的角度来看,它们的表现就像一台单机一样.系统将任务队列对称地分布于多个CPU之上,从而极大地提高了整个系统的数据处理能

java 创建和执行bat

/* */package com.***app.mappcore.impl.util; import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter; /** * 批处理文件的执行类.<br> * @author mapengfei <br> * @versio

NYOJ 237 游戏高手的烦恼 &amp;&amp; POJ3041-Asteroids ( 二分图的最大匹配 )

链接: NYOJ 237  游戏高手的烦恼:click here~~ POJ  3041 Asteroids           :click here~~ 题意: 两题一样,翻译不同而已. 有一位传说级游戏高手,在闲暇时间里玩起了一个小游戏,游戏中,一个n*n的方块形区域里有许多敌人,玩家可以使用炸弹炸掉某一行或者某一列的所有敌人.他是种玩什么游戏都想玩得很优秀的人,所以,他决定,使用尽可能少的炸弹炸掉所有的敌人. 现在给你一个游戏的状态,请你帮助他判断最少需要多少个炸弹才能炸掉所有的敌人吧.

爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)(二)

先看,前一期博客,理清好思路. 爬虫概念与编程学习之如何爬取网页源代码(一) 不多说,直接上代码. 编写代码 运行 <!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=Edge" /><meta http-equiv="Content-Type" content="text/html; c

51nod_1199 树的先跟遍历+区间更新树状数组

题目是中文,所以不讲题意 做法顺序如下: 使用先跟遍历,把整棵树平铺到一维平面中 使用自己整的区间更新树状数组模板进行相关操作. http://www.cnblogs.com/rikka/p/7359185.html 放代码如下: 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 6 /* 7 *常量MAXN用于设定树状数组的尺寸大小 8 */ 9 const long long MAXN=500233; 10 class TreeL

Gym - 101291C (很有意思的最短路)

题意: 给出一张地图和机器人还有出口的位置,地图上面有障碍.然后给出UDLR上下左右四种指令,遇到障碍物或者越界的指令会忽略,剩下的继续执行. 只要到达出口就算找到出口,然后给你一串指令,让你修改指令达到出口,删除或插入任意一个指令花费为1,问让机器人能够找到出口所花费最少. 思路: 感觉很有意思的一道最短路,思路是把每个点分成变成指令长度个点+1,然后就相当于有n^3个点.然后指令是顺序执行的,所以当前点的状态最多到达 周围可到达点的同一状态.所以我们就可以建边,如果我们走到隔壁点的当前状态就

uva 1600

没有想到第三维的数组,第三维区分同一个位置是否是穿墙到达的,很神奇,还有就是略微的dp思想没想到,同一个数组也是需要取最小值的 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn=25; int dict[6][3]={{1,0},{0,1},{-1,0},{0,-1}}; int m