uva 825 Walking on the Safe Side

题意:有t组测试数据,每组测试数据给一个矩阵n,m。接下来给出n行,每行第一个数字为该行的编号(从1开始),然后给出这行不能走的y坐标。问,从出发点(1,1),到(n,m)有多少种不同的路径(只能往下走或者往右走)。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=105;
void fun(int,char*);
bool vis[N][N],flag[N][N];
int n,m,map[N][N],next[2][2]={0,1,1,0};
int dp(int,int);
int main()
{
    int t,t_cnt=0;
    scanf("%d",&t);
    while(t--)
    {
        memset(flag,0,sizeof(flag));
        memset(vis,0,sizeof(vis));
        memset(map,0,sizeof(map));
        char str[100];
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
        {
            int temp;
            scanf("%d",&temp);
            gets(str);
            fun(temp,str);
        }
        int ans=dp(1,1);
        if(t_cnt++!=0) puts("");
        printf("%d\n",ans);
    }
    return 0;
}
void fun(int pos,char *str)
{
    int len=strlen(str),num=0;
    for(int i=0;i<len;i++)
    {
        if(isdigit(str[i]))
        {
            num=num*10+str[i]-'0';
        }
        else
        {
            if(num!=0) flag[pos][num]=1;
            num=0;
        }
    }
    if(num!=0) flag[pos][num]=1;
}
int dp(int x,int y)
{
    if(vis[x][y]) return map[x][y];
    else if(x==n&&y==m) {vis[x][y]=1;map[x][y]=1;return 1;}
    else
    {
        for(int i=0;i<2;i++)
        {
            int xx=x+next[i][0],yy=y+next[i][1];
            if(!flag[xx][yy]&&xx>0&&xx<=n&&yy>0&&yy<=m)
            {
                map[x][y]+=dp(xx,yy);
            }
        }
        vis[x][y]=1;
        return map[x][y];
    }
}


你可能感兴趣的:(测试,ini,fun)