• ZOJ 1056 The Worm Turns


    原题链接

    题目大意:贪吃蛇的简化版,给出一串操作命令,求蛇的最终状态是死是活。

    解法:这条蛇一共20格的长度,所以用一个20个元素的队列表示,队列的每个元素是平面的坐标。每读入一条指令,判断其是否越界,是否咬到了自己。若都没有,把改点压入队列,front元素弹出。

    参考代码:

    #include<iostream>
    #include<queue>
    #include<string>
    using namespace std;
    
    struct Point{
    	int r;
    	int c;
    };
    
    queue<Point> worm;
    
    bool isItself(queue<Point>,Point);
    
    int main(){
    	int i,n;
    	char str[102];
    	Point temp;
    	char x;
    	while(cin>>n&&n!=0){
    		while(!worm.empty())
    			worm.pop();
    		for(i=11;i<=30;i++){
    			temp.c=i;
    			temp.r=25;
    			worm.push(temp);
    		}
    		cin>>str;
    		i=1;
    		while(i<=n){
    			x=str[i-1];
    			temp=worm.back();
    			if(x=='W'){
    				temp.c-=1;
    				if((temp.c)<1){
    					cout<<"The worm ran off the board on move "<<i<<'.'<<endl;
    					break;
    				}
    				if(isItself(worm,temp)){
    					cout<<"The worm ran into itself on move "<<i<<'.'<<endl;
    					break;
    				}
    				worm.push(temp);
    				worm.pop();
    
    			}else{
    				if(x=='E'){
    					temp.c+=1;
    					if((temp.c)>50){
    						cout<<"The worm ran off the board on move "<<i<<'.'<<endl;
    						break;
    					}
    					if(isItself(worm,temp)){
    						cout<<"The worm ran into itself on move "<<i<<'.'<<endl;
    						break;
    					}
    					worm.push(temp);
    					worm.pop();
    				}else{
    					if(x=='S'){
    						temp.r+=1;
    						if((temp.r)>50){
    							cout<<"The worm ran off the board on move "<<i<<'.'<<endl;
    							break;
    						}
    						if(isItself(worm,temp)){
    							cout<<"The worm ran into itself on move "<<i<<'.'<<endl;
    							break;
    						}
    						worm.push(temp);
    						worm.pop();
    					}else{
    						if(x=='N'){
    							temp.r-=1;
    							if((temp.r)<1){
    								cout<<"The worm ran off the board on move "<<i<<'.'<<endl;
    								break;
    							}
    							if(isItself(worm,temp)){
    								cout<<"The worm ran into itself on move "<<i<<'.'<<endl;
    								break;
    							}
    							worm.push(temp);
    							worm.pop();
    						}
    					}
    				}
    			}
    
    	
    			if(i==n)
    				cout<<"The worm successfully made all "<<n<<" moves."<<endl;
    			i++;
    		}
    	}
    	
    	return 0;
    }
    
    bool isItself(queue<Point> worm,Point p){
    	int k;
    	queue<Point> w;
    	w=worm;
    	w.pop();
    	for(k=1;k<19;k++){
    		if(w.front().r==p.r&&w.front().c==p.c)
    			return true;
    		w.pop();
    	}
    	return false;
    }
  • 相关阅读:
    poj2661Factstone Benchmark
    完整的微信接口类 (转)
    位运算(转载)
    PHP学习笔记之数组游标操作
    MYSQL数据库数据拆分之分库分表总结 (转)
    webservice使用
    MySQL索引类型总结和使用技巧以及注意事项 (转)
    PHP empty、isset、isnull的区别
    myisam和innodb的区别
    看看PHP迭代器的内部执行过程(转)
  • 原文地址:https://www.cnblogs.com/naive/p/3568751.html
Copyright © 2020-2023  润新知