usaco月赛palpath
2015-10-10 23:08
274 查看
PALPATH
农民约翰的农场是一个N×N网格形状的田地(2≤N≤18),每一个都标有字母表中的字母。例如:ABCD
BXZX
CDXB
WCBA
每一天,贝西牛从左上方的田地,走到右下角走,每一步只能朝右或朝下走一格,贝茜记录她走的过程中生成的字符串。她变得很迷茫,因为如果这个字符串是一个回文(从前或从后阅读一样),她会困惑于哪个方向走了。
请帮助贝西确定不同的回文数她可以在走路中形成。不同的方法形成相同的回文只统计一次;例如,有几个路线产生回文ABXZXBA,但只有四个不同的回文贝茜可以形成,ABCDCBA,ABCWCBA,ABXZXBA ABXDXBA。
输入格式(文件palpath.in):
输入的第一行包含N,接下来有N行,每一行包含N个字符A. . Z的范围。
输出格式(文件palpath.out):
请输出贝西可以形成的不同的回文数目。
样例输入:
4
ABCD
BXZX
CDXB
WCBA
样例输出:
4
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<set> #define ll long long using namespace std; int n; char a[20][20]; string s=""; set<string> s1; set<string> ans; set<string>::iterator it; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } void init() { n=read(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { char ch=getchar(); while(ch<'A'||ch>'Z')ch=getchar(); a[i][j]=ch; } } void dfs1(int x,int y) { string item=s;s=s+a[x][y]; int l=s.length(); if(x+y>n){s1.insert(s);s=item;return;} if(x+1<=n)dfs1(x+1,y); if(y+1<=n)dfs1(x,y+1); s=item; return; } void dfs2(int x,int y) { string item=s;s=s+a[x][y]; int l=s.length(); if(l==n) { // cout<<s<<endl; it=s1.find(s); if(it!=s1.end())ans.insert(s);s=item; return; } if(x-1>=1)dfs2(x-1,y); if(y-1>=1)dfs2(x,y-1); s=item; return; } int main() { freopen("palpath.in","r",stdin); freopen("palpath.out","w",stdout); init(); dfs1(1,1);s=""; // cout<<s1.size()<<endl; dfs2(n,n); printf("%d\n",ans.size()); return 0; }
相关文章推荐
- Objective-C之类和对象
- 树状数组学习笔记
- 绘图quartz之阴影
- Android两个Activity之间的数据交换
- usaco月赛MOOCRYPT
- 关于git冲突报错-> Line XX: StartTag: invalid element name
- 用来计算平方根
- QQ聊天记录备份
- leetcode 23:Merge k Sorted Lists(15-10-10)
- github简单使用
- caffe windwos安装测试相关问题
- 转载:读懂C/C++递归
- 两个栈实现一个顺序栈
- 关于撑开父容器高度的小探讨
- ETL应用:使用shell实现文件级校验的方法
- 2015-10-10高项作业
- 月光族的最佳财务规划
- 教你用200行Python代码“换脸”
- Swing下的二维随机游走轨道模拟
- 数论 + 容斥 - HDU 4059 The Boss on Mars