| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
坑有點多用栈记氯经过的位置。得到一个序列之后,记氯每个方格最早和最晚出现的位置。然后遍历的时猴,从最早跳到最晚的位置的后面一个位置。中间的位置對应的方格全都填兖星號
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace std;
int x,y,sX,sY,gX,gY;
int firstV[15][15];
int lastV[15][15];
bool hengW[15][15];
bool zongW[15][15];
int num;
int xSeq[2000], ySeq[2000];
void print(int n){
if(n==0) printf("???");
else if(n==-1) printf(" ");
else if(n<10) printf(" %d", n);
else if(n<100) printf(" %d", n);
else printf("%d", n);
}
int main() {
int cntt = 0;
while(1){
cin >> x >> y >> sX >> sY >> gX >> gY;
if(x+y<=0) break;
cntt++;
printf("Maze %d\n\n", cntt);
for(int i = 1; i <= x; i++){
for(int j = 1; j <= y; j++){
firstV[i][j] = -1;
lastV[i][j] = -1;
}
}
for(int i = 0; i < 15; i++){
for(int j = 0; j < 15; j++){
if(i == 0 || i == x) hengW[i][j] = 1;
else hengW[i][j] = 0;
if(j == 0 || j == y) zongW[i][j] = 1;
else zongW[i][j] = 0;
}
}
for(int i = 1; i <= x; i++){
for(int j = 1; j <= y; j++){
int temp;
cin >> temp;
if(temp&1) zongW[i][j] = 1;
if(temp&2) hengW[i][j] = 1;
}
}
num = 1;
int curX = sX, curY = sY;
int nextX, nextY;
bool houtui = 0;
stack<int> xs, ys;
while(1){
//cout << curX << " " << curY << endl;
xSeq[num] = curX, ySeq[num] = curY;
if(firstV[curX][curY] == -1) firstV[curX][curY] = num;
lastV[curX][curY] = num;
xSeq[num] = curX, ySeq[num] = curY;
if(!houtui){
xs.push(curX), ys.push(curY);
}
if(curX == gX && curY == gY) break;
num++;
if(!zongW[curX][curY-1] && firstV[curX][curY-1] == -1){
nextX = curX, nextY = curY-1;
houtui = 0;
}
else if(!hengW[curX-1][curY] && firstV[curX-1][curY] == -1){
nextX = curX-1, nextY = curY;
houtui = 0;
}
else if(!zongW[curX][curY] && firstV[curX][curY+1] == -1){
nextX = curX, nextY = curY+1;
houtui = 0;
}
else if(!hengW[curX][curY] && firstV[curX+1][curY] == -1){
nextX = curX+1, nextY = curY;
houtui = 0;
}
else{
houtui = 1;
//cout << 1 << endl;
//nextX = lastX, nextY = lastY;
//cout << xs.size() << endl;
xs.pop(), ys.pop();
nextX = xs.top(), nextY = ys.top();
}
//lastX = curX, lastY = curY;
curX = nextX, curY = nextY;
}
/*
for(int i = 1; i <= num; i++){
cout << xSeq[i] << " " << ySeq[i] << endl;
}*/
int state[15][15];
for(int i = 0; i < 15; i++){
for(int j = 0; j < 15; j++){
state[i][j] = -1;
}
}
int numbering = 1;
int ii = 1;
while(1){
int nx = lastV[xSeq[ii]][ySeq[ii]];
state[xSeq[ii]][ySeq[ii]] = numbering;
numbering++;
if(xSeq[ii]==gX && ySeq[ii]==gY) break;
for(int j = ii+1; j < nx; j++){
state[xSeq[j]][ySeq[j]] = 0;
}
ii = nx+1;
}
printf("+");
for(int i = 0; i < y; i++) printf("---+");
printf("\n");
for(int i = 1; i <= x; i++){
printf("|");
for(int j = 1; j <= y; j++){
print(state[i][j]);
if(zongW[i][j]) printf("|");
else printf(" ");
}
printf("\n+");
for(int j = 1; j <= y; j++){
if(hengW[i][j]) printf("---");
else printf(" ");
printf("+");
}
printf("\n");
}
printf("\n\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator