朴素搜索即刻, 注意终止条件和行走路线的模拟.
/**//*
ID: lorelei3
TASK: snail
LANG: C++
*/
#include <fstream>
#include <cmath>
#include <memory.h>
using namespace std;
const int MAXN = 125;
const int dx[] = {1, 0,-1, 0};
const int dy[] = {0, 1, 0,-1};
ifstream fin("snail.in");
ofstream fout("snail.out");
char board[MAXN][MAXN];
int n,b;
void input(){
memset(board, '.', sizeof(board));
fin>>n>>b;
for(int i=0; i<b; ++i){
fin.get();
char ch; int a;
fin>>ch>>a;
board[a][ch-'A'+1]='#';
}
}
int ans;
bool bound(int x, int y){
if(x<1 || x>n) return true;
if(y<1 || y>n) return true;
if(board[x][y]=='#') return true;
if(board[x][y]=='0') return true;
return false;
}
bool terminal(int x, int y, int dir){
if(board[x+dx[dir]][y+dy[dir]]=='0')
return true;
for(int i=0; i<4; ++i){
if(abs(i-dir)==2) continue;
int tx=x+dx[i];
int ty=y+dy[i];
if(tx<1||tx>n) continue;
if(ty<1||ty>n) continue;
if(board[tx][ty]=='.')
return false;
}
return true;
}
void dfs(int x, int y, int dir,int cnt){
if(terminal(x,y,dir)){
if(cnt>ans)
ans=cnt;
return;
}
else{
board[x][y]='0';
int tx=x+dx[dir];
int ty=y+dy[dir];
int dt;
if(bound(tx,ty)){
dt=dir+1>3?0:dir+1;
tx=x+dx[dt];
ty=y+dy[dt];
if(!bound(tx,ty))
dfs(tx, ty, dt, cnt+1);
dt=dir-1<0?3:dir-1;
tx=x+dx[dt];
ty=y+dy[dt];
if(!bound(tx,ty))
dfs(tx, ty, dt, cnt+1);
}else
dfs(tx, ty, dir, cnt+1);
board[x][y]='.';
}
}
void output(){
fout<<ans<<endl;
}
int main(){
input();
dfs(1,1,0,1);
dfs(1,1,1,1);
output();
return 0;
}
posted on 2011-02-09 01:24
小阮 阅读(225)
评论(0) 编辑 收藏 引用 所属分类:
USACO