CCF CSP 2013年12月 I’m stuck!

\quad這就是一個搜索題,DFS和BFS均可。需注意搜索的時間複雜度爲O(m2n24)O(m^2n^2*4),最多每個有4個搜索方向。故而計算量達到2.51072.5*10^7,稍不留神就超時了。所以需要寫程序的時候進行一些優化,比如存放各個字符對應哪些搜索方向就不要採用判斷或者map存放,會導致最後一個點超時。
在這裏插入圖片描述

#include <iostream>
#include <map>
#include <queue>
#include <cstring>
using namespace std;

char g[55][55];
int dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, 1, -1};
vector<int> mp[128];
int m, n, vis[55][55], ss[55][55];

void bfs(int i, int j)
{
	memset(vis, 0, sizeof(vis));
	queue<pair<int, int>> q;
	q.push({i, j});
	while(!q.empty())
	{
		int x = q.front().first, y = q.front().second;
		q.pop();
		vis[x][y] = 1;
		vector<int> d = mp[g[x][y]];
		for(auto k: d)
		{
			int nx = x + dx[k], ny = y + dy[k];
			if(nx<0 || nx>=m || ny<0 || ny>=n || vis[nx][ny]==1) continue;
			if(g[nx][ny] == '#') continue;
			q.push({nx, ny});
			vis[nx][ny] = 1;
		}
	}
}
void Sbfs(int i, int j)
{
	memset(ss, 0, sizeof(ss));
	queue<pair<int, int>> q;
	q.push({i, j});
	while(!q.empty())
	{
		int x = q.front().first, y = q.front().second;
		q.pop();
		ss[x][y] = 1;
		vector<int> d = mp[g[x][y]];
		for(auto k: d)
		{
			int nx = x + dx[k], ny = y + dy[k];
			if(nx<0 || nx>=m || ny<0 || ny>=n || ss[nx][ny]==1) continue;
			if(g[nx][ny] == '#') continue;
			q.push({nx, ny});
			ss[nx][ny] = 1;
		}
	}
}
int main()
{
	mp['+'] = {0, 1, 2, 3}, mp['|'] = {0, 1}, mp['-'] = {2, 3}, mp['.'] = {1};
	mp['S'] = {0, 1, 2, 3}, mp['T'] = {0, 1, 2, 3};
	cin >> m >> n;
	int sx, sy, tx, ty;
	for(int i = 0; i < m; i++)
		for(int j = 0; j < n; j++)
		{
			cin >> g[i][j];
			if(g[i][j] == 'S') sx=i, sy=j;
			if(g[i][j] == 'T') tx=i, ty=j;
		}
	Sbfs(sx, sy);  // 遍歷從S能走到的所有地方,用ss數組記錄
	if(ss[tx][ty] == 0)
	{
		cout << "I'm stuck!" << endl;
		return 0;
	}
	int res = 0;
	for(int i = 0; i < m; i++)
		for(int j = 0; j < n; j++)
		{
			if(g[i][j]=='S' || g[i][j]=='T' || g[i][j]=='#') continue;
			bfs(i, j);
			if(vis[tx][ty]==0 && ss[i][j]==1) ++res;
		}
	cout << res << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章