本菜鸡用题解的做法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);
}
}
}
谢谢同学了!