关于文件的输入输出,只要在主函数中添加:
freopen("E:\\read9.txt","r",stdin);
freopen("E:\\write9.txt","w",stdout);
即可。
其余地方的输入输出不变,但是必须用scanf和printf进行输入输出。
实验一 迷宫问题(bfs)
#include"iostream" #include"stdio.h" #include"algorithm" #include"queue" #include"string.h" #include"cmath" #include"stack" #include"fstream" #define mx 105 #define inf 1000 using namespace std; int n,m; int sx,sy,ex,ey; int maze[mx][mx],vis[mx][mx]; int dir[8][2]= {{0,1},{0,-1},{1,0},{-1,0},{-1,-1},{-1,1},{1,-1},{1,1}}; bool judge(int x,int y) { if(maze[x][y]==0&&x>=0&&x<n&&y>=0&&y<m) { return true; } return false; } void output(int step) { int i; stack<int>path; path.push(ex*m+ey); printf("%s%d\n","最少步骤是:",step); int x=ex,y=ey,dx,dy; while(vis[x][y]!=0) { for(i=0;i<8;i++) { dx=x+dir[i][0]; dy=y+dir[i][1]; if(dx>=0&&dx<n&&dy>=0&&dy<m) if(vis[dx][dy]==vis[x][y]-1) { path.push(dx*m+dy); break; } } x=dx;y=dy; } printf("%s","最短路径为:"); while(!path.empty()) { int u=path.top(); path.pop(); x=u/m;y=u%m; if(x!=ex||y!=ey) printf("%s%d%s%d%s%s","(",x,",",y,")","->"); else printf("%s%d%s%d%s\n\n","(",x,",",y,")"); } } void bfs(int step) { queue<int>q; int i,x,y,dx,dy,u; x=sx;y=sy; u=x*m+y; q.push(u); while(!q.empty()) { u=q.front(); q.pop(); x=u/m;y=u%m; if(x==ex&&y==ey) { output(step); return; } int flag=1; step=vis[x][y]; for(i=0;i<8;i++) { dx=x+dir[i][0]; dy=y+dir[i][1]; if(judge(dx,dy)) { if(flag){step++;flag=0;} maze[dx][dy]=1; if(step<vis[dx][dy]) vis[dx][dy]=step; u=dx*m+dy; q.push(u); } } } printf("%s","没有满足条件的通路!\n"); } int main() { int i,j; freopen("C://read.txt","r",stdin); freopen("C://write.txt","w",stdout); while(scanf("%d%d",&n,&m),n||m) { for(i=0;i<n;i++) { for(j=0;j<m;j++) {scanf("%d",&maze[i][j]);vis[i][j]=inf;} } scanf("%d%d%d%d",&sx,&sy,&ex,&ey); maze[sx][sy]=1; vis[sx][sy]=0; bfs(0); } return 0; }