40分菜鸡求助
查看原帖
40分菜鸡求助
442497
beautysdream楼主2021/9/21 21:34

本菜鸡用题解的做法ac了,但是用自己的想法就一直只能得40分,所以来向各位求助。我的想法是建图,给每一个'.'标号,然后用数组存储一个点左右两个点的标号。最后dfs

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
char table[1000][1000];
int dir[5][3]={{0,-1},{-1,0},{1,0},{0,1}};//左上下右
//int deg;
int r,c,k;
int tot=0;
int close[1000][3];//0是左1是右
int d[1000][1000];
//n表示的是构造好得图中得顺序数,turn中0是左边1是上边
int dfs(int n,int len,int turn){
    if(len==k){tot++; return 0;}
    if(turn==0){
       if(close[n][0]>0)
            dfs(close[n][0],len+1,0);    
    }else{
        if(close[n][1]>0)
            dfs(close[n][1],len+1,1);        
    }
    return 0;
}
int main(){    
    int deg=0;\
    while(cin >> r >> c >> k){
        tot=0;
        //point.clear();
        memset(table,0,sizeof(table));
        memset(d,-1,sizeof(d));
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                cin >> table[i][j];
                if(table[i][j]=='.'){                    
                    d[i][j]=++deg;//从一开始                    
                    for(int m=0;m<=1;m++){
                        if(d[i+dir[m][0] ][j+dir[m][1] ]>0){
                            close[deg][m]=d[i+dir[m][0] ][j+dir[m][1] ];
                        }
                    }                    
                }
            }        
        }   
        for(int i=1;i<=deg;i++){            
            dfs(i,1,0);
            dfs(i,1,1);
        }
        if(k==1){
            printf("%d\n",tot/2);
        }else{
            printf("%d\n",tot);
        }
    }
}

谢谢同学了!

2021/9/21 21:34
加载中...