刚开始是想 用map来表示下字符的方向//typedef pair<int, int> PII;
//map<char, PII> MYDir;
//pair<int, int>p = make_pair(-1, 0);
然后,,,一直编译有错,,不知道可不可以用
后来,想着用结构体数组表示下就好了,然后,,结构体的运行结果一直有错(代码附在最后面,以后改吧,,,今天实在改烦了)......最终,用两个数组AC了....................................
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int N = 100+5;
char map[N][N];
int rc[N][N];//记录是否走过, 也可以记入步数
int r, c, s;
int i = 0, j = s;
void dfs(int i, int j)
{
int ni=i, nj=j;//now x, now y
// printf("1 ---- i:%d ni %d j:%d nj:%d mp:%c step %d %d \n", i, ni, j, nj, map[i][j], rc[i][j], rc[ni][nj]);
if(map[i][j] == '#'){//出去
// printf("%d %d %d step(s) to exit\n", i, j, rc[i][j]-1);
printf("%d step(s) to exit\n", rc[i][j]-1);
//因为i,j已经出去,rc记录的是假设未出去的步数,也可以理解为,刚开始就应该在map中,而不是在外面开始(我这个是从外面开始的)
return;
}
switch(map[i][j]){
case 'N': i-=1;break;
case 'S': i+=1;break;
case 'W': j-=1;break;
case 'E': j+=1;break;
default: break;
}
if(rc[i][j]){//循环
printf("%d step(s) before a loop of %d step(s)\n", rc[i][j]-1, rc[ni][nj]- rc[i][j]+1);//求循环,故a-b+1
return;
}
rc[i][j] = rc[ni][nj]+1;
// printf("2 ------- i:%d j:%d map:%c step %d %d \n", i, j,map[i][j], rc[i][j], rc[ni][nj]);
dfs(i, j);
}
int main()
{
while(cin >> r >> c >> s && r && c && s){
memset(map, '#', sizeof(map));
memset(rc, 0, sizeof(rc));
for(int i=1; i<=r; i++){
for(int j=1; j<=c; j++){
cin >> map[i][j];
}
}
rc[1][s] = 1;
dfs(1, s);
}
return 0;
}
/*
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;
//typedef pair<int, int> PII;
//map<char, PII> MYDir;
//pair<int, int>p = make_pair(-1, 0);
//dir['N'] = p;
struct Point{
char c;
bool flag;
int step;
Point(){
c = '#';
flag = false;
step = 0;
};
};
const int N = 100;
int r, c, SC, SR;
Point mp[N][N];
int i = 0, j = SC;
int ni=i, nj=j;//now x, now y
void dfs()
{
printf("1 ---- i:%d ni %d j:%d nj:%d mp. %c step %d %d \n", i, ni, j, nj, mp[i][j].c, mp[i][j].step, mp[ni][nj].step);
if(mp[i][j].c == '#'){//出去
printf("%d %d %d step(s) to exit\n", i, j, mp[i][j].step);
return;
}
if(mp[i][j].flag){//循环
printf("%d step(s) before a loop of %d step(s)\n", mp[i][j].step, mp[ni][nj].step- mp[i][j].step);
return;
}
mp[i][j].step = mp[ni][nj].step+1;//上一次dfs的下一步的步数
printf("2 ------- i:%d j:%d mp. %c step %d \n", i, j,mp[i][j].c, mp[i][j].step);
ni=i, nj=j;
switch(mp[i][j].c){
case 'N': i-=1;break;
case 'S': i+=1;break;
case 'W': j-=1;break;
case 'E': j+=1;break;
default: break;
}
mp[ni][nj].flag = true;//已走过
dfs();
}
int main()
{
while(cin >> r >> c >> SC && (r && c && SC)){
memset(&mp, 0, sizeof(mp));
for(int i=1; i<=r; i++){
for(int j=1; j<=c; j++){
cin >> mp[i][j].c;
}
}
mp[0][SC].c = 'S';
//cout << i << " " << j << endl;
dfs();
}
return 0;
}
*/