• Poj 1753


    题目大意:翻转棋游戏,在一个4*4的棋盘上,每个格子有两个颜色黑或白,把该个格子翻转(黑变白白变黑),同时它的上下左右4个格子也会如此,求把整个棋盘的颜色统一的方案,没有输出impossible

    解:状态压缩bfs,弱死了,首先是标记二掉了,一种状态出现过就不用取消了,二是忘记输出无解,wa+tle..,弱弱弱弱弱弱弱弱弱

    View Code
     1 //Flip Game
     2 const
     3         win1=65535;
     4         inf='1.txt';
     5         len=win1+100;
     6 var
     7         ac: array[0..5, 0..5]of longint=(
     8                                         (-1,-1,-1,-1,-1,-1),
     9                                         (-1, 1, 2, 3, 4, -1),
    10                                         (-1, 5, 6, 7, 8, -1),
    11                                         (-1, 9, 10, 11, 12, -1),
    12                                         (-1, 13, 14, 15, 16, -1),
    13                                         (-1, -1, -1, -1, -1, -1)
    14                                         );
    15         chaos: longint;
    16         ans: longint;
    17         q, step: array[0..len]of longint;
    18         visit: array[0..win1]of boolean;
    19 procedure init;
    20 var
    21         i, j: longint;
    22         c: char;
    23 begin
    24   fillchar(visit, sizeof(visit), 0);
    25   chaos := 0;
    26   for i := 1 to 4 do begin
    27     for j := 1 to 4 do begin
    28       read(c);
    29       if c='b' then chaos := chaos or (1 << (ac[i, j]-1));
    30     end;
    31     readln;
    32   end;
    33 end;
    34 
    35 procedure main;
    36 var
    37         head, tail, u, i, j, tmp: longint;
    38 begin
    39   head := 0; tail := 1;
    40   q[tail] := chaos;
    41   step[tail] := 1;
    42   visit[chaos] := true;
    43   ans := -1;
    44   if (chaos=0)or(chaos=win1) then begin ans := 0; exit; end;
    45   repeat
    46     inc(head); if head=len then head := 1;
    47     u := q[head];
    48     for i := 1 to 4 do
    49       for j := 1 to 4 do begin
    50         //tmp
    51         tmp := u;
    52         if i>1 then tmp := tmp xor (1 << (ac[i-1, j]-1));
    53         if j<4 then tmp := tmp xor (1 << (ac[i, j+1]-1));
    54         if i<4 then tmp := tmp xor (1 << (ac[i+1, j]-1));
    55         if j>1 then tmp := tmp xor (1 << (ac[i, j-1]-1));
    56         tmp := tmp xor (1<<(ac[i, j]-1));
    57         //tmp
    58 
    59         if visit[tmp]=false then begin
    60           if (tmp=win1)or(tmp=0) then begin
    61             ans := step[head];
    62             exit;
    63           end;
    64           visit[tmp] := true;
    65           inc(tail); if tail=len then tail := 1;
    66           step[tail] := step[head]+1;
    67           q[tail] := tmp;
    68         end;
    69       end;
    70   until head=tail;
    71 end;
    72 
    73 procedure print;
    74 begin
    75   if ans>-1 then writeln(ans)
    76     else writeln('Impossible');
    77 end;
    78 
    79 begin
    80   assign(input,inf); reset(input);
    81   init;
    82   main;
    83   print;
    84 end.
  • 相关阅读:
    创建型模式
    创建、修改、删除表总结
    分页式存储管理及地址转换(网易笔试题)
    二进制、十进制、十六进制相互转换
    转 String,StringBuffer与StringBuilder的区别??
    IDEA 修改某个Module名称
    IDEA Git 修改后的文件无法Commit
    git git push某一次的commit记录
    git merge 结果是 git merge Already up-to-date. 该怎么解决?
    火币网API文档——REST 行情、交易API简介
  • 原文地址:https://www.cnblogs.com/wmzisfoolish/p/2483094.html
Copyright © 2020-2023  润新知