POJ1992(Jack)

11 篇文章 0 订阅

这道题是问你有多少种能最快到达终点的方法。注意这里的最快不是相对是最快。而是路线只能向右或者向下 不允许向上或者向左走。

题目的数据很弱,所以我直接用广搜也过了。但是跟大神们的代码比真的是太搓了。真心想不到什么好的办法。

下面是我的代码:

#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值