您的位置:首页 > 其它

2563:统计问题

2015-09-19 22:27 447 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2563

方法一:dfs打表

思路:方法一比较流氓,完全是利用了数据小这一点,不过也算是锻炼一下dfs吧,一看题,整个题目叙述简直就是迷宫题的翻版啊有木有,不假思索直接dfs了,然后跪了。首先,dfs速度太慢,必然超时;此外这里的迷宫的起点选择要注意,选择在迷宫矩阵的正中央,由于n不会超过20,矩阵开到40*40就可以保证左右均可以走,否则会造成数组越界;还有,如果按照我的写法,需要把起点也要标记上,否则会走回原点。

难点:dfs的改写

注意:主函数内注释掉的部分是dfs主体部分,由于只要dfs存在就会超时,因此可耻地直接打表了。

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
const int MAX = 100;
int num,n;
int dir[3][2] = {{1,0},{-1,0},{0,1}};
int book[MAX][MAX] = {0};
void dfs(int x,int y,int step)
{
    int dx,dy;

     if(step == n)
    {
        //cout<<x<<" "<<y<<endl;
        num++;
        return;
    }
    book[50][0] = 1;
    for(int i = 0;i < 3;i++)
    {
        dx = x+dir[i][0];
        dy = y+dir[i][1];

        if(book[dx][dy] == 1)
            continue;

        book[dx][dy] = 1;
        dfs(dx,dy,step+1);
        book[dx][dy] = 0;
    }
}
int main()
{
    int t;
    int ans[25] = {0,3,7,17,41,99,239,577,1393,3363,8119,19601,47321,114243,275807,665857,1607521,3880899,9369319,22619537,54608393};
    /*for(n= 1;n <= 20;n++)
    {
        book[MAX][MAX] = {0};
        num = 0;
        dfs(50,0,0);
        ans
 = num;
            cout<<ans
<<" ";
    }*/
    while(cin>>t)
    {
        while(t--)
        {
            cin>>n;
            cout<<ans
<<endl;
        }
    }

}


方法二:递推

思路:这个方法是比较主流的方法,代码实现也比较简单,时间上也是可以允许的,但是思路还是没有搞懂,附思路链接:
http://www.cnblogs.com/cchun/archive/2012/02/15/2520236.html
难点:递推关系式的构建,代码实现分分钟

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int getNum(int x)
{
    if(x == 1)
        return 3;
    else if(x == 0)
        return 1;
    else
        return 2*getNum(x-1)+getNum(x-2);
}
int main()
{
    int t,n;
    while(cin>>t)
    {
        while(t--)
        {
            cin>>n;
            cout<<getNum(n)<<endl;
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: