• poj1573


    题意:给出一个矩形,N,E,S,W分别代表进行移动的方向,如果走出矩形网格则输出经过的网格数,如果在矩形网格内循环,则输出没进入循环之前所走过的网格数和循环所经过的网格数;

    思路:创建两个数组,一个字符数组存每个网格中所要进行的操作,另一个整型数组代表状态,0代表没走过,1代表走过了,然后模拟;

       再提醒一点,建立的字符和整型数组要和题目中建里的一模一样,因为这个我又WA了一发、

       

    #include<iostream>
    #include<cstring>
    using namespace std;
    const int qq=15;
    int gid[qq][qq];char s[qq][qq];
    int main()
    {
    	int n,m,k;
    	while(cin >> n >> m >> k)
    	{	
    		cin.get();
    		if(n==0&&m==0&&k==0)	break;
    	memset(gid,0,sizeof(gid));
    	for(int i=0;i<=m+1;++i){
    		gid[0][i]=1;gid[n+1][i]=1;  //外围标记
    	}
    	for(int i=0;i<=n+1;++i){         //外围标记
    		gid[i][0]=1;gid[i][m+1]=1;
    	}
    	for(int j,i=1;i<=n;++i){
    		for(j=1;j<=m;++j)
    			s[i][j]=cin.get();
    		cin.get();
    	}
    	int x,y;x=k;y=1;int tot=0;
    	while(!gid[y][x]){              
    		while(!gid[y][x]&&s[y][x]=='N'){
    			gid[y][x]=1;y-=1;++tot;
    		}
    		while(!gid[y][x]&&s[y][x]=='E'){
    			gid[y][x]=1;x+=1;++tot;
    		}
    		while(!gid[y][x]&&s[y][x]=='S'){
    			gid[y][x]=1;y+=1;++tot;
    		}
    		while(!gid[y][x]&&s[y][x]=='W'){
    			gid[y][x]=1;x-=1;++tot;
    		}
    	}
    	if(x<1||y<1||x>m||y>n)	cout << tot << " step(s) to exit
    ";  
    	else{
    		int count=0;
    		while(gid[y][x]){                //计算循环所经过的网格数  此时1,0的意义互换
    			while(gid[y][x]&&s[y][x]=='N'){
    				gid[y][x]=0;y-=1;++count;
    			}
    			while(gid[y][x]&&s[y][x]=='E'){
    				gid[y][x]=0;x+=1;++count;
    			}
    			while(gid[y][x]&&s[y][x]=='S'){
    				gid[y][x]=0;y+=1;++count;
    			}
    			while(gid[y][x]&&s[y][x]=='W'){
    				gid[y][x]=0;x-=1;++count;
    			}
    		}
    		cout << tot-count << " step(s) before a loop of " << count << " step(s)
    ";
    	}
    	}
    } 
    

      

  • 相关阅读:
    oracle常用命令(比较常见好用)
    vim编辑器详解
    对话框和打印控件
    winform弹出唯一的窗体
    ListView
    菜单栏和布局
    窗体属性和公共控件
    ASPCMS和WPF
    MVC
    正则表达式
  • 原文地址:https://www.cnblogs.com/sasuke-/p/5116231.html
Copyright © 2020-2023  润新知