• zoj 1008 Gnome Tetravex


    典型的回溯,这题我一拖再拖,拖了好几天,然后觉得自己写不出来。可是今天搜了一下,答案是如此简短明了,我真的很诧异,难道我真的不行?好吧,我是一个回溯都没写过,所以才会这么力不从心,决定做几题练一练。

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 int q[25];
     5 int s[25][4];
     6 int num[25];
     7 int flag,n,l;
     8 void dfs(int len)
     9 {
    10     if(flag)
    11         return;
    12     if(len == n * n)
    13     {
    14         flag = 1;
    15         return;
    16     }
    17     int i;
    18     for(i = 0;i < l;i++)
    19     {
    20         if(num[i] > 0)
    21         {
    22             if(len % n != 0)
    23             {
    24                 if(s[i][3] != s[q[len - 1]][1])
    25                     continue;
    26             }
    27             if(len / n != 0)
    28             {
    29                 if(s[i][0] != s[q[len - n]][2])
    30                     continue;
    31             }
    32             q[len] = i;
    33             num[i]--;
    34             dfs(len + 1);
    35             if(flag)
    36                 return;
    37             num[i]++;
    38         }
    39     }
    40     return;
    41 }
    42 int main()
    43 {
    44     int m = 0;
    45     while(cin>>n, n)
    46     {
    47         memset(q,0,sizeof(q));
    48         memset(num,0,sizeof(num));
    49         int i,j,a,b,c,d;
    50         l = 0;
    51         for(i = 0;i < n * n;i++)
    52         {
    53             cin>>a>>b>>c>>d;
    54             for(j = 0;j < l;j++)
    55             {
    56                 if(s[j][0] == a && s[j][1] == b && s[j][2] == c && s[j][3] == d)
    57                 {
    58                     num[j]++;
    59                     break;
    60                 }
    61             }
    62             if(j >= l)
    63             {
    64                 s[l][0] = a;
    65                 s[l][1] = b;
    66                 s[l][2] = c;
    67                 s[l][3] = d;
    68                 num[l] = 1;
    69                 l++;
    70             }
    71         }
    72         flag = 0;
    73         dfs(0);
    74         if(m)
    75             cout<<endl;
    76         cout<<"Game "<<++m<<": ";
    77         if(flag)
    78             cout<<"Possible"<<endl;
    79         else
    80             cout<<"Impossible"<<endl;
    81     }
    82     return 0;
    83 }
  • 相关阅读:
    聊聊ASP.NET Core默认提供的这个跨平台的服务器——KestrelServer[转]
    java的war包和jar包的区别
    shell编程中的表达式(-d, -f, -L 等)
    nginx 403 forbidden
    docker删除镜像
    TCP的拥塞控制
    文件从暂存区撤销
    charles修改返回结果的4种方法
    LED 正负极区分
    病毒传播模拟游戏制作日志(三)
  • 原文地址:https://www.cnblogs.com/lzxskjo/p/2598309.html
Copyright © 2020-2023  润新知