• poj 2965 BFS


    状态压缩,记录路径

      1 #include <iostream>
    2 #include <string.h>
    3 #include <stdio.h>
    4 using namespace std;
    5 const int maxx=100000;
    6 char c[4][4];
    7 int que[maxx],cnt,step[maxx],n;
    8 struct FF
    9 {
    10 int fa;
    11 int path;
    12 };
    13 FF father[maxx];
    14 int t[16]={63624,62532,61986,61713,36744,20292,
    15 12066,7953,35064,17652,8946,4593,34959,17487,8751,4383};
    16 bool visit[maxx];
    17 void print(int x)
    18 {
    19 switch(x)
    20 {
    21 case 63624:printf("1 1\n");break;
    22 case 62532:printf("1 2\n");break;
    23 case 61986:printf("1 3\n");break;
    24 case 61713:printf("1 4\n");break;
    25 case 36744:printf("2 1\n");break;
    26 case 20292:printf("2 2\n");break;
    27 case 12066:printf("2 3\n");break;
    28 case 7953:printf("2 4\n");break;
    29 case 35064:printf("3 1\n");break;
    30 case 17652:printf("3 2\n");break;
    31 case 8946:printf("3 3\n");break;
    32 case 4593:printf("3 4\n");break;
    33 case 34959:printf("4 1\n");break;
    34 case 17487:printf("4 2\n");break;
    35 case 8751:printf("4 3\n");break;
    36 case 4383:printf("4 4\n");break;
    37 }
    38 }
    39 void bfs(int s)
    40 {
    41 int f,r,qfront,now;
    42 f=0;
    43 r=1;
    44 visit[s]=1;
    45 que[0]=s;
    46 father[s].fa=0;
    47 father[s].path=0;
    48 while(f<r)
    49 {
    50 qfront=que[f];
    51 f++;
    52 for(int i=0;i<=15;i++)
    53 {
    54 now=qfront^t[i];
    55 if(now==0)
    56 {
    57 father[now].fa=qfront;
    58 father[now].path=i;
    59 n=now;
    60 step[now]=step[qfront]+1;
    61 return ;
    62 }
    63 if(!visit[now])
    64 {
    65 father[now].fa=qfront;
    66 father[now].path=i;
    67 step[now]=step[qfront]+1;
    68 visit[now]=1;
    69 que[r]=now;
    70 r++;
    71 }
    72 }
    73 }
    74 }
    75
    76 void dfs(int x)
    77 {
    78 if(father[x].fa==0)
    79 return;
    80 dfs(father[x].fa);
    81 print(t[father[x].path]);
    82 }
    83
    84 int main()
    85 {
    86 int s=0,i,j;
    87 //freopen("iin.txt","r",stdin);
    88 for(i=0;i<4;i++)
    89 for(j=0;j<4;j++)
    90 cin>>c[i][j];
    91 for(i=0;i<4;i++)
    92 for(j=0;j<4;j++)
    93 {
    94 if(c[i][j]=='+')
    95 s=s^(1<<(15-4*i-j));
    96 }
    97 bfs(s);
    98 printf("%d\n",step[0]);
    99 dfs(n);
    100 return 0;
    101 }



  • 相关阅读:
    以太坊客户端geth的基本操作命令
    以太坊虚拟机介绍5-比较操作指令
    以太坊虚拟机介绍4-按位运算指令
    浏览器内核
    javascript 几个易错点记录
    jq常用方法
    jq事件操作汇总
    js事件总汇
    margin 负边距 的知识点
    子div撑不开父div的几种解决办法:
  • 原文地址:https://www.cnblogs.com/inpeace7/p/2425448.html
Copyright © 2020-2023  润新知