zoukankan      html  css  js  c++  java
  • 2013 Asia acm Hangzhou Regional Contest 杭州现场赛

     B Stealing Harry Potter's Precious

    题目大意:给定一个n*m的地图,某些点可以走,某些点可以走某些点不可以走,给定一个起点,又给出了k个点k<=4,要求从起点经过K个点最短的长度是多少

    思路:给每个点标定状态为[x][y][state],state是压缩状态的已经走过需要走过点的集合,然后bfs一下即可

     1 #include<cstdio>
     2 #include<queue>
     3 #include<cstring>
     4 #define maxn 101
     5 using namespace std;
     6 const int dx[10]={0,0,0,1,-1};
     7 const int dy[10]={0,1,-1,0,0};
     8 int map[maxn][maxn],full,n,m,sx,sy,x,y,ma;
     9 char ch[maxn];
    10 struct T{int x;int y;int st;int dist;};
    11 int cal(int x,int y){if(y<=1)return x;return x|(1<<(y-3));}
    12 bool visit[maxn][maxn][16];
    13 int bfs(int x,int y)
    14 {
    15         queue<T>q;T a;
    16         a.x=x;a.y=y;a.st=cal(0,map[x][y]);a.dist=0;
    17         visit[a.x][a.y][a.st]=1;
    18         q.push(a);
    19         while(!q.empty())
    20         {
    21                 T u=q.front();
    22                 q.pop();
    23                 for(int i=1;i<=4;i++)
    24                 {
    25                         int xx=u.x+dx[i],yy=u.y+dy[i];
    26                         if(xx<1||xx>n||yy<1||yy>m||map[xx][yy]==1)continue;
    27                         T v;v.x=xx;v.y=yy;
    28                         v.st=cal(u.st,map[xx][yy]);
    29                         v.dist=u.dist+1;
    30                         if(visit[v.x][v.y][v.st]==1)continue;
    31                         visit[v.x][v.y][v.st]=1;
    32                         if(v.st==full)
    33                         {
    34                                 return v.dist;
    35                         }
    36                         q.push(v);
    37                 }
    38         }
    39         return -1;
    40 }
    41 int main()
    42 {
    43         while(scanf("%d%d",&n,&m)!=EOF)
    44         {
    45                 memset(visit,0,sizeof(visit));
    46                 if(n==0 && m==0)break;
    47                 for(int i=1;i<=n;i++)
    48                 {
    49                         scanf("%s",ch+1);
    50                         for(int j=1;j<=m;j++)
    51                         {
    52                                 if(ch[j]=='#')map[i][j]=1;else map[i][j]=0;
    53                                 if(ch[j]=='@')sx=i,sy=j;
    54                         }
    55                 }
    56                 int k;
    57                 scanf("%d",&k);
    58                 full=(1<<k)-1;
    59                 for(int i=1;i<=k;i++)
    60                 {
    61                         scanf("%d%d",&x,&y);
    62                         map[x][y]=i+2;
    63                 }
    64                 printf("%d
    ",bfs(sx,sy));
    65         }
    66     return 0;
    67 }
    View Code

    C - Zhuge Liang's Password

    题目大意:给出两个矩阵,要求两个矩阵旋转之后的最大重合的数字个数

    思路:直接模拟

     1 #include<cstdio>
     2 #include<queue>
     3 #include<cstring>
     4 #define maxn 101
     5 using namespace std;
     6 int a[maxn][maxn],n,b[maxn][maxn];
     7 void rot(){
     8         int c[maxn][maxn]={{0}};
     9         for(int i=1;i<=n;i++)
    10                 for(int j=1;j<=n;j++)c[i][j]=a[j][n-i+1];
    11         memcpy(a,c,sizeof(a));
    12 }
    13 int main()
    14 {
    15         while(scanf("%d",&n)!=EOF){
    16                 if(n==0)break;
    17                 for(int i=1;i<=n;i++)
    18                         for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);
    19                 for(int i=1;i<=n;i++)
    20                         for(int j=1;j<=n;j++)scanf("%d",&b[i][j]);
    21                 int ans=0;
    22                 for(int k=1;k<=4;k++){
    23                         int temp=0;
    24                         rot();
    25                         for(int i=1;i<=n;i++)
    26                                 for(int j=1;j<=n;j++)
    27                                         if(a[i][j]==b[i][j])temp++;
    28                         ans=max(ans,temp);
    29                 }
    30                 printf("%d
    ",ans);
    31         }
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    matlab练习程序(灰度图直方图均衡化)
    二叉查找树
    hadoop入门介绍
    配置虚拟机Ubuntu网络连接
    hadoop ubuntu (单节点)部署
    Thrift
    linux打包压缩命令汇总
    [转载]ubuntu 启动流程
    linux命令大全
    Linux文件查找命令find,xargs详述
  • 原文地址:https://www.cnblogs.com/philippica/p/4282571.html
Copyright © 2011-2022 走看看