zoukankan      html  css  js  c++  java
  • Noip2017 普及 T3 Chess

    神奇的场上原码

        #include<iostream>
        #include<cstdio>
        #include<cstring>
        #include<queue>
        //red 0 yellow 1 nothing 2
        using namespace std;
        int map[101][101],n,m,ans=0x7fffffff,vis[101][101];
        const int px[4]={1,-1,0,0},py[4]={0,0,1,-1};
        struct node{
            int lx,ly,x,y,step;
        }chx[101][101];
        int get_step(int lx,int ly,int x,int y,int fx,int fy,int s){
            if(map[x][y]==0x7f7f7f7f and map[fx][fy]==0x7f7f7f7f)return 0x7fffffff;
            if(map[x][y]==map[fx][fy])return 0;
            if(map[x][y]+map[fx][fy]==1)return 1;
            if(map[x][y]==0x7f7f7f7f)return map[lx][ly]==map[fx][fy]?0:1;
            if(map[fx][fy]==0x7f7f7f7f)return 2;
        }
        void bfs(int xx,int yy){
            queue<node> q;
            q.push(node{-1,-1,xx,yy,0});
            vis[xx][yy]=0;
            while(!q.empty()){
                int lx=q.front().lx;
                int ly=q.front().ly;
                int x=q.front().x;
                int y=q.front().y;
                int step=q.front().step;
                q.pop();
                if((x==n and y==n) or (step>vis[x][y])){
                    continue;
                }
                for(int i=0;i<=3;i++){
                    int fx=x+px[i];
                    int fy=y+py[i];
                    if(fx<=n and fx>=1 and fy<=n and fy>=1){
                        int fs=get_step(lx,ly,x,y,fx,fy,step);
                        if(fs!=0x7fffffff){
                            if(vis[fx][fy]>step+fs){
                                vis[fx][fy]=step+fs;
                                q.push(node{x,y,fx,fy,step+fs});
                            }
                        }
                    }
                }
            }
        }
        int main(){
        //    freopen("chess.in","r",stdin);
        //    freopen("chess.out","w",stdout);
            memset(map,0x7f,sizeof(map));
            memset(vis,0x7f,sizeof(vis));
            scanf("%d%d",&n,&m);
            for(int i=1;i<=m;i++){
                int x,y;
                scanf("%d%d",&x,&y);
                scanf("%d",&map[x][y]);
            }
            bfs(1,1);
            printf("%d",vis[n][n]==0x7f7f7f7f?-1:vis[n][n]);
            return 0;
        }
    

    现在再贴一个堆广搜(但是可能会被恶心地卡掉

        #include<iostream>
        #include<cstdio>
        #include<queue>
        #include<cstring>
        using namespace std;
        const int INF=0x7f7f7f7f,px[4]={1,-1,0,0},py[4]={0,0,1,-1};
        int n,m,map[101][101],d[101][101];
        struct node{
            int lx,ly,x,y,step;
            bool operator < (const node & b)const{
                return step>b.step;
            }
        };
        int get_step(int lx,int ly,int x,int y,int fx,int fy){
            if(map[x][y]==INF){
                if(map[fx][fy]==INF)return INF;
                if(map[lx][ly]==map[fx][fy]){
                    return 0;
                } else return 1;
            }
            if(map[fx][fy]==INF)return 2;
            if(map[x][y]==map[fx][fy]){
                return 0;
            }else return 1;
        }
        void bfs(int xx,int yy){
            priority_queue<node> q;
            q.push((node){-1,-1,xx,yy,0});
            d[xx][yy]=0;
            while(!q.empty()){
                int lx=q.top().lx;
                int ly=q.top().ly;
                int x=q.top().x;
                int y=q.top().y;
                int step=q.top().step;
                q.pop();
                if(x==n and y==n){
                    return;
                }
                for(int i=0;i<=3;i++){
                    int fx=x+px[i];
                    int fy=y+py[i];
                    if(fx<=n and fx>=1 and fy<=n and fy>=1){
                        int fs=get_step(lx,ly,x,y,fx,fy);
                        if(fs!=INF and step+fs<d[fx][fy]){
                            d[fx][fy]=step+fs;
                            q.push((node){x,y,fx,fy,step+fs});
                        }
                    }
                }
            }
        }
        int main(){
            memset(map,0x7f,sizeof(map));
            memset(d,0x7f,sizeof(d));
            scanf("%d%d",&n,&m);
            for(int i=1;i<=m;i++){
                int x,y;
                scanf("%d%d",&x,&y);
                scanf("%d",&map[x][y]);
            }
            bfs(1,1);
            printf("%d
    ",d[n][n]==0x7f7f7f7f?-1:d[n][n]);
            return 0;
    }
    
  • 相关阅读:
    iOS 第四期考核题(字符串/字典/数组的使用)
    oc之字典创建 复制 获取key value值
    oc之字典排序(将字符串转换成数字排序) 把字典放在数组内进行输出 字典赋值
    oc之可变字典创建 添加 删除 遍历
    oc之NSSortDescriptor(描述器排序)
    oc之获取系统当前时间的方法
    oc之数组排序 id nsobject instancetype的区别
    oc之类排序
    oc--习题
    oc 笔记--NSArray NSMutableArray 创建 添加 查询 复制 遍历等
  • 原文地址:https://www.cnblogs.com/ezoihy/p/8899696.html
Copyright © 2011-2022 走看看