• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

kaikai向前走

转职任务完成。崭新fn诞生
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

google china code jam入围赛的一个题

连了1个多小时都没登陆成功,就去群里聊天。听朋友说了个题目,我觉得有思路就写了一下。
后来终于登陆成功了,可惜我分配到19组题目不一样- -。

问题是这样的,一个m*n的字母矩阵内可以找到多少8连通路径匹配一个长度为k的串。m,n,k都不超过50
如果匹配数量超过10^9就直接返回-1.

#pragma warning(disable:4786)
#include 
<vector>
#include 
<string>
#include 
<cstdio>
using namespace std;
class A
{
public:
    
int get(vector< string > _map, string a)
    
{
        
const int max = 1000000000;
        
char map[52][52] = {0};
        
int m = _map.size(), n;
        
int i, j;
        
string::size_type k;
        
for (i = 0; i < m; i++)
        
{
            strcpy(map[i
+1] + 1, _map[i].c_str());
        }

        n 
= _map[0].size();
        
        
int count[2][52][52] = {0};
        
{
            
int (&pd)[52][52] = count[0];
            
char c = a[0];
            
for (i = 1; i <= m; i++)
            
{
                
for (j = 1; j <= n; j++)
                
{
                    
if (map[i][j] == c)
                        pd[i][j] 
= 1;
                }

            }

        }

        
        
for (k = 1; k < a.size(); k++)
        
{
            
int (&pd)[52][52] = count[k%2];
            
int (&ps)[52][52] = count[(k+1)%2];
            memset(pd, 
0, sizeof(int) * 52 * 52);
            
char c = a[k];
            
for (i = 1; i <= m; i++)
            
{
                
for (j = 1; j <= n; j++)
                
{
                    
if (map[i][j] != c) // 这里把map写成了_map,谢谢
                        
continue;
                    pd[i][j] 
= ps[i-1][j-1]+ps[i][j-1];
                    
if (pd[i][j] > max) return -1;
                    pd[i][j] 
+= ps[i+1][j-1];
                    
if (pd[i][j] > max) return -1;
                    pd[i][j] 
+= ps[i-1][j];
                    
if (pd[i][j] > max) return -1;
                    pd[i][j] 
+= ps[i+1][j];
                    
if (pd[i][j] > max) return -1;
                    pd[i][j] 
+= ps[i-1][j+1];
                    
if (pd[i][j] > max) return -1;
                    pd[i][j] 
+= ps[i][j+1];
                    
if (pd[i][j] > max) return -1;
                    pd[i][j] 
+= ps[i+1][j+1];
                    
if (pd[i][j] > max) return -1;
                }

            }

        }

        
int sum = 0;
        
int (&ps)[52][52]=count[(k+1)%2];
        
for (i = 1; i <= m; i++)
        
{
            
for (j = 1; j <= n; j++)
            
{
                sum 
+= ps[i][j];
                
if (sum > max)
                    
return -1;
            }

        }

        
return sum;
    }

    
}
;
/**//*
{"AAAAA",
"AAAAA",
"AAAAA",
"AAAAA",
"AAAAA"}
"AAAAAAAAAAA"
Returns: -1
超过1,000,000,000的路径,则直接返回-1. 
kaikai (30170377) 22:38:25
复杂度m*n*k 
沐枫(Liny)(189416) 22:28:47
{"AB",
"CD"}
"AA"
结果:0 
沐枫(Liny)(189416) 22:30:42
{"AA",
"AA"}
"AAAA"
结果: 108 
*/

#include 
<cstdio>

int main()
{
    A a;
    vector
< string > d1;
    d1.push_back(
"AAAAA");
    d1.push_back(
"AAAAA");
    d1.push_back(
"AAAAA");
    d1.push_back(
"AAAAA");
    d1.push_back(
"AAAAA");
    printf(
"%d\n", a.get(d1, "AAAAAAAAAAA"));
    vector
< string > d2;
    d2.push_back(
"AB");
    d2.push_back(
"CD");
    printf(
"%d\n", a.get(d2, "AA"));
    vector
< string > d3;
    d3.push_back(
"AA");
    d3.push_back(
"AA");
    printf(
"%d\n", a.get(d3, "AAAA"));
    
return 0;
}

posted on 2005-12-13 22:39  kaikai  阅读(1138)  评论(5)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3