这道题是问你有多少种能最快到达终点的方法。注意这里的最快不是相对是最快。而是路线只能向右或者向下 不允许向上或者向左走。
题目的数据很弱,所以我直接用广搜也过了。但是跟大神们的代码比真的是太搓了。真心想不到什么好的办法。
下面是我的代码:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef struct{
int x, y;
}Point;
typedef struct{
Point Q[1100];
int top, tail;
}Que;
Que q;
void ini() {q.top = 0, q.tail = 0;}
void push(int x, int y) {q.Q[q.tail].x = x, q.Q[q.tail].y = y;q.tail++; if(q.tail > 1099) q.tail = 0;}
Point pop() {Point tt; tt = q.Q[q.top++]; if(q.top > 1099) q.top = 0; return tt;}
bool empty() {if(q.tail == q.top) return 1; return 0;}
int R, S;
bool map[1005][1005];
int f[1005][1005];
int main()
{
int Case;
int i, j;
char x;
Point tt;
while(scanf("%d", &Case) != EOF){
while(Case--){
scanf("%d%d", &R, &S);
for(i = 0; i < R; ++i)
{
getchar();
for(j = 0; j < S; ++j){
scanf("%c", &x);
map[i][j] = (x == '.'? 1 : 0);
f[i][j] = 0;
}
}
push(0, 0);f[0][0] = 1;
while(!empty())
{
tt = pop();
if(map[tt.x + 1][tt.y])
{
if(!f[tt.x + 1][tt.y]) push(tt.x + 1, tt.y);
f[tt.x + 1][tt.y] += f[tt.x][tt.y];
}
if(map[tt.x][tt.y + 1])
{
if(!f[tt.x][tt.y + 1]) push(tt.x, tt.y + 1);
f[tt.x][tt.y + 1] += f[tt.x][tt.y];
}
}
printf("Existuje %d ruznych cest.\n", f[R - 1][S - 1]);
}
}
return 0;
}
看到自己的代码这么挫于是抓紧去学习了,改进以后的代码: (很容易看懂,都不用写思路。直接看代码就能明白。)
#include<stdio.h>
#include<string.h>
int main()
{
int T;
int R, S;
int a[1001];
char b[1001];
int i, j;
while(scanf("%d", &T) != EOF){
while(T--)
{
scanf("%d%d", &R, &S);
memset(a, 0, sizeof(a));
a[0] = 1;
getchar();
for(i = 0; i < R; ++i)
{
gets(b);
for(j = 0; j < S; ++j)
{
if(!i && !j) continue;
if(b[j] == '.' && j > 0)
a[j] += a[j - 1];
else if(b[j] == '#')
a[j] = 0;
}
}
printf("Existuje %d ruznych cest.\n", a[S - 1]);
}
}
return 0;
}