社区讨论

一个输出错误且结果只差1

P1535[USACO08MAR] Cow Travelling S参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo9yblwv
此快照首次捕获于
2023/10/28 19:21
2 年前
此快照最后确认于
2023/11/02 11:01
2 年前
查看原帖
用的是暴力法,第七个WA。而且WA的点的输出只和答案差1。
我的输出:14396413
答案输出:14396412
代码和样例下面提供。
代码:
CPP
#include <iostream>
#include <queue>
#include <cmath>
using namespace std;

typedef long long ll;

typedef struct Position{
	ll i, j, t;
} po;

ll ii[4] = {0, 1, 0, -1};
ll jj[4] = {1, 0, -1, 0};
ll n, m, t, cnt = 0;
ll si, sj, di, dj;
char arr[205][205];
ll dp[205][205][15] = {0};

void bfs();

int main(){
	cin >> n >> m >> t;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			cin >> arr[i][j];
		}
	}
	cin >> si >> sj >> di >> dj;
	//也不是bfs,乱起的名字
	bfs();
	cout << dp[di][dj][t];
	return 0;
}

//函数名是乱起的
void bfs(){
	dp[si][sj][0] = 1;
	ll nexti, nextj;
	//枚举时间
	for(int tt = 1; tt <= t; tt++){
		//枚举位置
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= m; j++){
				if(arr[i][j] == '*') continue;
				//能通往这个位置的个数,即上下左右过来
				for(int k = 0; k < 4; k++){
					nexti = i + ii[k];
					nextj = j + jj[k];
					if(nexti >= 1 && nexti <= n && nextj >= 1 && nextj <= m && arr[nexti][nextj] != '*'){
						dp[i][j][tt] += dp[nexti][nextj][tt - 1];
					}
				}
			}
		}
//		for(int i = 1; i <= n; i++){
//			for(int j = 1; j <= m; j++){
//				cout << dp[i][j][tt] << " ";
//			}
//			cout << " \n";
//		}
//		cout << "\n";
	}
}
样例:
CPP
20 20 15
..*.......**...*....
................**..
....*............*..
....**............*.
..*.................
.....*..............
.............*.**...
........*..*......**
.............*.*.*..
.....*........*.....
.*..*....*..........
*................*..
***.................
.........*....*.....
.......**...........
...........**.....*.
..*.*...............
....*......*........
....................
........*.......*...
18 11 18 10

回复

4 条回复,欢迎继续交流。

正在加载回复...