zoukankan      html  css  js  c++  java
  • Uva 10422 Knights in FEN

    Problem D   Knights in FEN

    Input: standard input    Output: standard output    Time Limit: 10 seconds

    解题思路:

    这题完全照搬刘汝佳书里的思想,感觉照搬他的代码对自己来说感到真心的别扭,极力的希望想在里面找到点值得学习的东西,真心去发现还是能学到不少东西的,比如说用“引用”简化代码,不屈于题目的情景而用一维数组表示二维的内容,不知道这样能不能锻炼到自己的思维,有时几天没做题或当时一题卡你几天真心急了的时候,就会忘记做题的初衷是什么了,就像这次,开始并没有用哈希查找,直接就线性遍历查看有无重复情况出现,后来发现不是一般的慢啊!一个一个输出查看的时候感觉不是很慢,但如果等到移动的步数到10的时候就超过了一分钟了,接着想自己处理一下一些特殊的情况,也就是将移动的步数为9和10的不再放入到队列里面(不进行广度查找)发现还是很难改变现状。无奈后来用了书里介绍的STL中的set结构后,发现效率增加了不少啊!这时发现很多事情都是由细节所决定的,往往一件小事看不出什么问题,但如果量变到了一定的时候,那么效果就出来了

    题目链接:

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=110&page=show_problem&problem=1363

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<set>
     5 #define NUM 10000000
     6 using namespace std;
     7 typedef int State[25];
     8 State st[NUM], temp, source, goal = {1,1,1,1,1,0,1,1,1,1,0,0,-1,1,1,0,0,0,0,1,0,0,0,0,0};
     9 int dist[NUM], head[NUM], next[NUM];
    10 int dir[8][2] = {{-2, -1}, {-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}};
    11 set<int> vis;
    12 
    13 int try_to_insert(int s)
    14 {
    15     int v=0;
    16     for(int i=0;i<25;i++) v=v*2+st[s][i];
    17     v=v*2+1;
    18     if(vis.count(v)) return 0;
    19     vis.insert(v);
    20     return 1;
    21 }
    22 
    23 int Traverse()
    24 {
    25     vis.clear();
    26     int front, rear, i, j, x, y, blank, z, d, flag, k, newx, newy;
    27     front = 1, rear = 2;
    28     while(front<rear)
    29     {
    30         for(blank=0; blank<25 && st[front][blank] != -1; ++blank);
    31         if(memcmp(goal, st[front], sizeof(State)) == 0) return front;
    32         x = blank/5, y = blank%5;
    33         for(d=0; d<8; ++d)
    34         {
    35             i = x+dir[d][0];
    36             j = y+dir[d][1];
    37             z = i*5+j;
    38             if(i>=0 && i<5 && j>=0 && j<5)
    39             {
    40                 memcpy(st[rear], st[front], sizeof(State));
    41                 st[rear][z] = st[front][blank];
    42                 st[rear][blank] = st[front][z];
    43                 dist[rear] = dist[front] + 1;
    44                 if(try_to_insert(rear) && dist[rear] < 11)
    45                 {
    46                     if(dist[rear] == 10 && memcmp(goal, st[rear], sizeof(State)) == 0) return rear;
    47                     rear++;
    48                 }
    49             }
    50         }
    51         front++;
    52     }
    53     return 0;
    54 }
    55 
    56 
    57 int main()
    58 {
    59     #ifndef ONLINE_JUDGE
    60     freopen("input.txt", "r", stdin);
    61     #endif
    62     
    63     int i, j, N, ans, cnt=0;
    64     char input;
    65     scanf("%d", &N);
    66     while(N--)
    67     {
    68         getchar();
    69         for(cnt=0; cnt<25;)
    70         {
    71             scanf("%c", &input);
    72             switch(input)
    73             {
    74                 case '1': st[1][cnt++] = 1; break;
    75                 case '0': st[1][cnt++] = 0; break;
    76                 case ' ': st[1][cnt++] = -1; break;
    77             }
    78         }
    79         memset(dist, 0, sizeof(dist));
    80         ans = 0;
    81         ans = Traverse();
    82         if(ans == 0) printf("Unsolvable in less than 11 move(s).\n");
    83         else printf("Solvable in %d move(s).\n", dist[ans]);
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    [ERR] Node 10.211.55.8:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    PAT A1137 Final Grading (25 分)——排序
    PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
    PAT A1134 Vertex Cover (25 分)——图遍历
    PAT A1133 Splitting A Linked List (25 分)——链表
    PAT A1132 Cut Integer (20 分)——数学题
    PAT A1130 Infix Expression (25 分)——中序遍历
    PAT A1142 Maximal Clique (25 分)——图
    PAT A1141 PAT Ranking of Institutions (25 分)——排序,结构体初始化
    PAT A1140 Look-and-say Sequence (20 分)——数学题
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/3067508.html
Copyright © 2011-2022 走看看