| ||||||||||
| 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 | |||||||||
水题一个根苯用不着queue,bfs廣搜的話,每次就最多增加一個新的點
#include <iostream>
#include <stdio.h>
using namespace std;
int M, N;
bool mmp[100][100];
struct r{
int i,j,dir;
};
bool bianjie(int i, int j, int dir){
if(dir == 0) return i==0 || i==N;
return j==0 || j==M;
}
bool valid(r &R){
return R.i != -1 && R.j != -1 && R.dir != -1;
}
void getAdj(int i, int j, int dir, r &r1, r &r2){
if(!bianjie(i,j,dir)){
if(dir == 0){
if(mmp[i-1][j]){
r1.dir = 1; r1.i = i-1; r1.j = j;
}
else{
r1.dir = 1; r1.i = i-1; r1.j = j+1;
}
if(mmp[i][j]){
r2.dir = 1; r2.i = i; r2.j = j+1;
}
else{
r2.dir = 1; r2.i = i; r2.j = j;
}
}
else{
if(mmp[i][j-1]){
r1.dir = 0; r1.i = i; r1.j = j-1;
}
else{
r1.dir = 0; r1.i = i+1; r1.j = j-1;
}
if(mmp[i][j]){
r2.dir = 0; r2.i = i+1; r2.j = j;
}
else{
r2.dir = 0; r2.i = i; r2.j = j;
}
}
}
else{
r2.dir = -1; r2.i = -1; r2.j = -1;
if(dir == 0 && i == 0){
r1.dir = 1;
if(mmp[i][j]){
r1.i = i; r1.j = j+1;
}
else{
r1.i = i; r1.j = j;
}
}
else if(dir == 0){
r1.dir = 1;
if(mmp[i-1][j]){
r1.i = i-1; r1.j = j;
}
else{
r1.i = i-1; r1.j = j+1;
}
}
if(dir == 1 && j == 0){
r1.dir = 0;
if(mmp[i][j]){
r1.i = i+1; r1.j = j;
}
else{
r1.i = i; r1.j = j;
}
}
else if(dir == 1){
r1.dir = 0;
if(mmp[i][j-1]){
r1.i = i; r1.j = j-1;
}
else{
r1.i = i+1; r1.j = j-1;
}
}
}
}
int main() {
int gs = 0;
while(1){
gs++;
scanf("%d%d", &M, &N);
if(M==0 && N==0) return 0;
bool used[100][100][2] = {0};
int quanCnt = 0;
int maxLen = 0;
char temp[100];
for(int i = 0; i < N; i++){
scanf("%s", temp);
for(int j = 0; j < M; j++){
char c = temp[j];
if(c == '/') mmp[i][j] = 0;
else mmp[i][j] = 1;
}
}
for(int j = 0; j < M; j++){
if(used[0][j][0]) continue;
used[0][j][0] = 1;
int curI = 0, curJ = j, curDir = 0;
while(1){
r R1, R2;
getAdj(curI, curJ, curDir, R1, R2);
int nextI, nextJ, nextDir;
if(used[R1.i][R1.j][R1.dir]){
nextI = R2.i, nextJ = R2.j, nextDir = R2.dir;
}
else{
nextI = R1.i, nextJ = R1.j, nextDir = R1.dir;
}
used[nextI][nextJ][nextDir] = 1;
if(bianjie(nextI, nextJ, nextDir)) break;
curI = nextI, curJ = nextJ, curDir = nextDir;
}
}
//cout << 1 << endl;
for(int j = 0; j < M; j++){
if(used[N][j][0]) continue;
used[N][j][0] = 1;
int curI = N, curJ = j, curDir = 0;
while(1){
r R1, R2;
getAdj(curI, curJ, curDir, R1, R2);
int nextI, nextJ, nextDir;
if(used[R1.i][R1.j][R1.dir]){
nextI = R2.i, nextJ = R2.j, nextDir = R2.dir;
}
else{
nextI = R1.i, nextJ = R1.j, nextDir = R1.dir;
}
used[nextI][nextJ][nextDir] = 1;
if(bianjie(nextI, nextJ, nextDir)) break;
curI = nextI, curJ = nextJ, curDir = nextDir;
}
}
for(int i = 0; i < N; i++){
if(used[i][0][1]) continue;
used[i][0][1] = 1;
int curI = i, curJ = 0, curDir = 1;
while(1){
r R1, R2;
getAdj(curI, curJ, curDir, R1, R2);
int nextI, nextJ, nextDir;
if(used[R1.i][R1.j][R1.dir]){
nextI = R2.i, nextJ = R2.j, nextDir = R2.dir;
}
else{
nextI = R1.i, nextJ = R1.j, nextDir = R1.dir;
}
used[nextI][nextJ][nextDir] = 1;
if(bianjie(nextI, nextJ, nextDir)) break;
curI = nextI, curJ = nextJ, curDir = nextDir;
}
}
for(int i = 0; i < N; i++){
if(used[i][M][1]) continue;
used[i][M][1] = 1;
int curI = i, curJ = M, curDir = 1;
while(1){
r R1, R2;
getAdj(curI, curJ, curDir, R1, R2);
int nextI, nextJ, nextDir;
if(used[R1.i][R1.j][R1.dir]){
nextI = R2.i, nextJ = R2.j, nextDir = R2.dir;
}
else{
nextI = R1.i, nextJ = R1.j, nextDir = R1.dir;
}
used[nextI][nextJ][nextDir] = 1;
if(bianjie(nextI, nextJ, nextDir)) break;
curI = nextI, curJ = nextJ, curDir = nextDir;
}
}
//cout << 1 << endl;
for(int i = 1; i < N; i++){
for(int j = 0; j < M; j++){
if(used[i][j][0]) continue;
quanCnt++;
used[i][j][0] = 1;
int len = 1;
int curI = i, curJ = j, curDir = 0;
//int firstI = i, firstJ = j, firstDir = 0;
while(1){
r R1, R2;
getAdj(curI, curJ, curDir, R1, R2);
int nextI, nextJ, nextDir;
if(used[R1.i][R1.j][R1.dir] && used[R2.i][R2.j][R2.dir]) break;
if(used[R1.i][R1.j][R1.dir]){
nextI = R2.i, nextJ = R2.j, nextDir = R2.dir;
}
else{
nextI = R1.i, nextJ = R1.j, nextDir = R1.dir;
}
//if(nextI == firstI && nextJ == firstJ && nextDir == firstDir) break;
used[nextI][nextJ][nextDir] = 1;
len++;
curI = nextI, curJ = nextJ, curDir = nextDir;
}
if(len > maxLen) maxLen = len;
}
}
//cout << 1 << endl;
for(int i = 0; i < N; i++){
for(int j = 1; j < M; j++){
if(used[i][j][1]) continue;
quanCnt++;
used[i][j][1] = 1;
int len = 1;
int curI = i, curJ = j, curDir = 1;
//int firstI = i, firstJ = j, firstDir = 1;
while(1){
r R1, R2;
getAdj(curI, curJ, curDir, R1, R2);
int nextI, nextJ, nextDir;
if(used[R1.i][R1.j][R1.dir] && used[R2.i][R2.j][R2.dir]) break;
if(used[R1.i][R1.j][R1.dir]){
nextI = R2.i, nextJ = R2.j, nextDir = R2.dir;
}
else{
nextI = R1.i, nextJ = R1.j, nextDir = R1.dir;
}
//if(nextI == firstI && nextJ == firstJ && nextDir == firstDir) break;
used[nextI][nextJ][nextDir] = 1;
len++;
curI = nextI, curJ = nextJ, curDir = nextDir;
}
if(len > maxLen) maxLen = len;
}
}
printf("Maze #%d:\n", gs);
if(quanCnt == 0){
printf("There are no cycles.\n\n");
}
else{
printf("%d Cycles; the longest has length %d.\n\n", quanCnt, maxLen);
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator