程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva705一次AC

uva705一次AC

編輯:C++入門知識

這題讀完想了一會,沒有什麼思路,不知道如何處理‘\’和‘/’,因為它們是“牆”,但是這牆是具有方向性的;而且沒有路,輸入全部由“牆”組成,與以往做過的圖找路徑的題目有很大的不同,一時沒有辦法。

後來看了網上的思路,覺得非常好。做法就是把原圖放大2倍或3倍。放大2倍是指用2*2的0-1矩陣表示‘\’或‘/’

具體為‘\’表示成1 0 '/'表示成 0 1

0 1 1 0

同理,放大三倍的表示方法為:

‘\’表示為1 0 0 ‘/’表示為0 0 1

0 1 0 0 1 0

0 0 1 1 0 0

這樣做的好處是放大了牆,從而產生了路。0表示路,1表示牆,處理起來就方便多了。放大2倍每步要考慮8個方向,放大3倍考慮4個方向即可。

附上AC代碼,一次AC!

#include
#include
using namespace std;

int w,h,circles,maxroad,map[250][250];
int dr[4]={-1,0,1,0};
int dc[4]={0,1,0,-1};
bool ok=1,visit[250][250];
void fill(int type,int row,int column){
	if (type==1){
		map[row][column]=1;map[row][column+1]=0;map[row][column+2]=0;
		map[row+1][column]=0;map[row+1][column+1]=1;map[row+1][column+2]=0;
		map[row+2][column]=0;map[row+2][column+1]=0;map[row+2][column+2]=1;
	}
	else{
		map[row][column]=0;map[row][column+1]=0;map[row][column+2]=1;
		map[row+1][column]=0;map[row+1][column+1]=1;map[row+1][column+2]=0;
		map[row+2][column]=1;map[row+2][column+1]=0;map[row+2][column+2]=0;
	}
}
int dfs(int row,int column,int &steps){
	int nr,nc;
	for (int i=0;i<4;i++){
		nr=row+dr[i];
		nc=column+dc[i];
		if (nr<0||nr>=3*h||nc<0||nc>=3*w||visit[nr][nc]==-1) {
			ok=0;
			visit[row][column]=-1;
		}
		else if (visit[nr][nc]==0&&map[nr][nc]==0) {
			visit[nr][nc]=1;
			steps++;
			dfs(nr,nc,steps);
		}
	}
	return steps;

}
void init()
{
	circles=0;
	maxroad=0;
	ok=1;
	memset(visit,0,sizeof(visit));
}
int main(){
	int col=0;
	while(cin>>w>>h&&w)
	{
		init();
		col++;
		for (int i=0;i>c;
				if (c=='\\') fill(1,3*i,3*j);
				else if (c=='/') fill(2,3*i,3*j);
				else cout<<"wrong input!"<maxroad) maxroad=count;
						}
					}
				
			}
		}
		cout<<"Maze #"<0)	cout<


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved