• USACO 2.4.1 The Tamworth Two 题解


    【算法】模拟  【难度】★☆☆☆☆


    直接模拟。
    注意如果牛和人开始绕圈子会陷入死循环,所以在时间足够大的时候退出,具体的临界值我选了10000000,nocow上有证明说最多160000步

    【收获】极限情况判断

    View Code
      1 /*
    2 ID: wsc5001
    3 LANG: C
    4 TASK: ttwo
    5 */
    6 #include <stdio.h>
    7 #include <stdlib.h>
    8 struct wz{int x,y,fs;};
    9 int ct=0;
    10 int map[12][12];// 0=可通过√ 1=墙x
    11 struct wz moveit(struct wz c)
    12 {
    13 struct wz ans;
    14 if (c.fs==0)//
    15 {
    16 if (map[c.x-1][c.y]==1||map[c.x-1][c.y]==-1)
    17 {
    18 ans=c;
    19 ans.fs=1;
    20 return ans;
    21 }
    22 else
    23 {
    24 ans=c;
    25 ans.x=c.x-1;
    26 return ans;
    27 }
    28 }
    29 if (c.fs==1)//
    30 {
    31 if (map[c.x][c.y+1]==1||map[c.x][c.y+1]==-1)
    32 {
    33 ans=c;
    34 ans.fs=2;
    35 return ans;
    36 }
    37 else
    38 {
    39 ans=c;
    40 ans.y=c.y+1;
    41 return ans;
    42 }
    43 }
    44 if (c.fs==2)//
    45 {
    46 if (map[c.x+1][c.y]==1||map[c.x+1][c.y]==-1)
    47 {
    48 ans=c;
    49 ans.fs=3;
    50 return ans;
    51 }
    52 else
    53 {
    54 ans=c;
    55 ans.x=c.x+1;
    56 return ans;
    57 }
    58 }
    59 if (c.fs==3)//
    60 {
    61 if (map[c.x][c.y-1]==1||map[c.x][c.y-1]==-1)
    62 {
    63 ans=c;
    64 ans.fs=0;
    65 return ans;
    66 }
    67 else
    68 {
    69 ans=c;
    70 ans.y=c.y-1;
    71 return ans;
    72 }
    73 }
    74 }
    75 int main()
    76 {
    77 freopen("ttwo.in","r",stdin);
    78 freopen("ttwo.out","w",stdout);
    79 int i,j,tms=0;
    80 char temp;
    81 struct wz f,c,sf,sc;
    82 for (i=0;i<12;i++)
    83 for (j=0;j<12;j++)
    84 map[i][j]=-1;
    85 for (i=1;i<=10;i++)
    86 {
    87 for (j=1;j<=10;j++)
    88 {
    89 scanf("%c",&temp);
    90 if(temp=='.') map[i][j]=0;
    91 if(temp=='*') map[i][j]=1;
    92 if(temp=='C') {map[i][j]=0;c.x=i;c.y=j;}
    93 if(temp=='F') {map[i][j]=0;f.x=i;f.y=j;}
    94 }
    95 scanf("%c",&temp);
    96 }
    97 sf.x=f.x; sf.y=f.y;
    98 sc.x=c.x; sc.y=c.y;
    99
    100 c.fs=0; f.fs=0;
    101
    102 while (ct<=10000000)
    103 {
    104 c=moveit(c);
    105 f=moveit(f);
    106 ct++;
    107 if (c.x==f.x && c.y==f.y)
    108 {printf("%d\n",ct);break;}
    109 if (c.x==sc.x && c.y==sc.y && f.x==sf.x && f.y==sf.y)
    110 tms++;
    111 if (tms==4)
    112 {printf("0\n");break;}
    113 }
    114 if (ct>10000000)printf("0\n");
    115 //system("pause");
    116 fclose(stdin);
    117 fclose(stdout);
    118 }



  • 相关阅读:
    easyui-tree/combotree 子节点前端懒加载(主要解决ie11下加载慢
    解决 Chrome 下表单自动填充问题 (两种方法
    代码编辑器:本地JS文件上传并加载到页面
    PC端使用rem进行屏幕适配
    ECharts 点击非图表区域的点击事件不触发问题
    Angular2+ 使用 Post 请求下载文件
    Express + Element-ui 实现图片/文件上传
    phpMyAdmin -- 没有权限操作用户
    Note of Moment -- 日期处理
    Angular 自定义表单控件 -- CheckboxGroupComponent
  • 原文地址:https://www.cnblogs.com/loveidea/p/2416940.html
Copyright © 2020-2023  润新知