Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

var (
	sc = bufio.NewScanner(os.Stdin)
)

type Point struct {
	X, Y int
}

type Gem struct {
	ID int
	Point
}

type Map struct {
	Current       *Point
	Gems          map[int]*Gem
	CollectedGems map[int]*Gem
}

func (m *Map) Move(dir string, l int) {
	switch {
	case dir == "N" || dir == "S":
		a := 1
		if dir == "S" {
			a = -1
		}
		for i := 0; i < l; i++ {
			m.Current.Y += a
			for _, g := range m.Gems {
				m.TryToTakeGem(g)
			}
		}
	case dir == "E" || dir == "W":
		a := 1
		if dir == "W" {
			a = -1
		}
		for i := 0; i < l; i++ {
			m.Current.X += a
			for _, g := range m.Gems {
				m.TryToTakeGem(g)
			}
		}
	}
}

func (m *Map) HasCompleted() bool {
	return len(m.Gems) == 0
}

func (m *Map) TryToTakeGem(g *Gem) {
	if m.Current.X == g.X && m.Current.Y == g.Y {
		m.CollectedGems[g.ID] = g
		delete(m.Gems, g.ID)
	}
}

func main() {
	for sc.Scan() {
		n, _ := strconv.Atoi(sc.Text())
		if n == 0 {
			break
		}
		m := &Map{
			Current:       &Point{X: 10, Y: 10},
			Gems:          map[int]*Gem{},
			CollectedGems: map[int]*Gem{},
		}
		for i := 0; i < n; i++ {
			sc.Scan()
			chunks := strings.Split(sc.Text(), " ")
			x, _ := strconv.Atoi(chunks[0])
			y, _ := strconv.Atoi(chunks[1])
			m.Gems[i+1] = &Gem{ID: i + 1, Point: Point{X: x, Y: y}}
		}
		sc.Scan()
		opCnt, _ := strconv.Atoi(sc.Text())
		for i := 0; i < opCnt; i++ {
			sc.Scan()
			chunks := strings.Split(sc.Text(), " ")
			dir := chunks[0]
			v, _ := strconv.Atoi(chunks[1])
			m.Move(dir, v)
		}
		msg := "No"
		if m.HasCompleted() {
			msg = "Yes"
		}
		fmt.Println(msg)
	}
}

C++: #pragma warning( disable : 4996 )
#include <stdio.h>
#include <map>
#include <vector>

typedef unsigned int DWORD;		//DWORD

//２次元ベクトルクラス
class Vector2{

public:

	Vector2(){

		x = y = 0;

	}

	Vector2( int _x , int _y ){

		x = _x;
		y = _y;

	}

	int x;
	int y;

	Vector2 operator +( Vector2 &_Arg ){

		Vector2 ret;
		
		ret.x = x + _Arg.x;
		ret.y = y + _Arg.y;

		return ret;

	}

	void operator +=( Vector2 &_Arg ){

		x += _Arg.x;
		y += _Arg.y;

	}

	Vector2 operator *( int &_Arg ){

		Vector2 ret( x * _Arg , y * _Arg );

		return ret;

	}

	void operator *=( int &_Arg ){

		x *= _Arg;
		y *= _Arg;

	}

	bool operator ==( Vector2 &_Arg ){

		return ( x == _Arg.x && y == _Arg.y );

	}

	bool operator !=( Vector2 &_Arg ){

		return ( x != _Arg.x || y != _Arg.y );

	}

	static Vector2 Normalize( Vector2 _Vec ){

		Vector2 ret;

		if( _Vec.x > 0 ) ret.x = 1;
		else if( _Vec.x < 0 ) ret.x = -1;
		else ret.x = 0;

		if( _Vec.y > 0 ) ret.y = 1;
		else if( _Vec.y < 0 ) ret.y = -1;
		else ret.y = 0;

		return ret;

	}			//正規化

};

//ワールド情報クラス
class World{

public:

	World(){

		for( int i = 0 ; i < Width ; i++ ){

			for( int j = 0 ; j < Height ; j++ ){

				m_ItemFlag[i][j] = false;

			}

		}

	}		//コンストラクタ

	bool IsInArea( Vector2 _Pos ){

		return ( _Pos.x >= 0 && _Pos.x < Width && _Pos.y >= 0 && _Pos.y < Height );

	}			//範囲内か？
	
	bool IsInArea( int _x , int _y ){

		return ( _x >= 0 && _x < Width && _y >= 0 && _y < Height );

	}			//範囲内か？

	void SetItem( Vector2 _Pos ){

		m_ItemFlag[_Pos.x][_Pos.y] = true;

	}			//アイテムをセット
	
	void SetItem( DWORD _x , DWORD _y ){

		m_ItemFlag[_x][_y] = true;

	}			//アイテムをセット

	bool GetItem( Vector2 _Pos ){

		if( IsInArea( _Pos ) && m_ItemFlag[_Pos.x][_Pos.y] ){

			m_ItemFlag[_Pos.x][_Pos.y] = false;
			return true;

		}

		return false;

	}		//指定した座標にあるアイテムを取得
	bool GetItem( DWORD _x , DWORD _y ){

		if( IsInArea( _x , _y ) && m_ItemFlag[_x][_y] ){

			m_ItemFlag[_x][_y] = false;
			return true;

		}

		return false;

	}		//指定した座標にあるアイテムを取得

	DWORD GetItemsPosToPos( Vector2 _Start , Vector2 _MoveVec ){

		DWORD ret = 0;

		Vector2 LoopEnd( 0 , 0 );

		while( _MoveVec != LoopEnd ){

			Vector2 Move = Vector2::Normalize( _MoveVec );

			if( GetItem( _Start + Move ) ) ret++;

			if( _MoveVec.x > 0 ) _MoveVec.x--;
			else if( _MoveVec.x < 0 ) _MoveVec.x++;
			if( _MoveVec.y > 0 ) _MoveVec.y--;
			else if( _MoveVec.y < 0 ) _MoveVec.y++;

		}

		return ret;

	}		//_Startから_MoveVec移動した場合に取得できる

	enum {

		Width = 20 ,	//幅
		Height = 20		//高さ

	};

	DWORD GetItemNum(){

		DWORD ret = 0;

		for( int i = 0 ; i < Width ; i++ ){

			for( int j = 0 ; j < Height ; j++ ){

				if( m_ItemFlag[i][j] ) ret++;

			}

		}

		return ret;

	}			//ワールド上に落ちている残りアイテム数を取得

private:

	bool m_ItemFlag[Width][Height];		//アイテムフラグ

};

int main(){

	std::map< char , Vector2 > MoveMap;		//移動方向
	std::vector< bool > ClearFlag;			//クリアフラグ
	MoveMap['N'] = Vector2( 0 , 1 );
	MoveMap['E'] = Vector2( 1 , 0 );
	MoveMap['S'] = Vector2( 0 , -1 );
	MoveMap['W'] = Vector2( -1 , 0 );

	while( true ){

		DWORD n;
		World w;
		scanf( "%d" , &n );

		if( n == 0 ) break;

		for( DWORD i = 0 ; i < n ; i++ ){

			Vector2 ItemPos;
			scanf( "%d %d" , &ItemPos.x , &ItemPos.y );
			w.SetItem( ItemPos );

		}

		DWORD m;
		scanf( "%d" , &m );

		Vector2 Position( 10 , 10 );

		for( DWORD i = 0 ; i < m ; i++ ){

			char c , Dummy;
			int v;
			scanf( "%c%c %d" , &Dummy , &c , &v );

			Vector2 MoveVec = MoveMap[c] * v;
			
			w.GetItemsPosToPos( Position , MoveVec );
			Position += MoveVec;

		}

		ClearFlag.push_back( w.GetItemNum() == 0 );

	}

	for( std::vector< bool >::size_type i = 0 ; i < ClearFlag.size() ; i++ ){

		if( ClearFlag[i] ) printf( "Yes\n" );
		else printf( "No\n" );

	}

	return 0;

}

C++: #include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<cmath>
using namespace std;

#define ll long long int
#define ld long long double
#define reps(i,f,n) for(int i=f;i<n;i++)
#define rep(i,n) reps(i,0,n)
#define m1 cout<<"move1"<<endl
#define m2 cout<<"move2"<<endl
#define m3 cout<<"move3"<<endl
#define m4 cout<<"move4"<<endl

int judge(int  v[][21]){
  // cout<<endl;         
  rep(i,21){
    rep(j,21){
      //cout<<v[i][j]<<" ";
      if(v[i][j] == 1)
      return 1;
    }
    //cout<<endl;
  }
  return 0;
}
  
  


int main(){
  ll N;
  ll M;
  char C;
  ll X,Y;
  ll length;
  int  v[21][21];
  ll x,y;

  while(cin>>N,N){
    x = 10; y = 10;
    rep(i,21)
      rep(j,21)
      v[i][j] = 0;
    rep(i,N){
    cin>>X>>Y;
    v[Y][X] = 1;
    }
    cin>>M;
    rep(j,M){
      cin>>C;
      //cout<<C<<endl;
      cin>>length;
      if(C == 'N'){
	reps(i,y+1,length + 1 + y){
	  v[i][x] = 0;
	}
	y +=length;
      }
      if( C== 'S'){
	for(int i = y-1; i >= y -length; i--){
	  v[i][x] = 0;
	}
	y -= length;
      }
      if(C == 'E'){
	reps(i,x+1,length+x+1){
	  v[y][i] = 0;
	}
	x += length;
      }
      if(C =='W'){
	for(int i = x-1; i >= x - length;i--){
	  v[y][i] = 0;
	}
	x -= length;
      }
    }
    if(judge(v))
      cout<<"NO"<<endl;
    else
      cout<<"YES"<<endl;

  }

  return 0;
}

C++: #include<iostream>
using namespace std;
int coord[21][21];
int loc_i=10,loc_j=10;

void func_Juge(char c,int l){
  if(c=='N'){
    for(int i=0;i<l;i++){
      loc_i++;
      if(coord[loc_i][loc_j]==1)coord[loc_i][loc_j]=0;
    }
  }else if(c=='S'){
    for(int i=0;i<l;i++){
      loc_i--;
      if(coord[loc_i][loc_j]==1)coord[loc_i][loc_j]=0;
    }
  }else if(c=='E'){
    for(int i=0;i<l;i++){
      loc_j++;
   if(coord[loc_i][loc_j]==1)coord[loc_i][loc_j]=0;
    }
  }else if(c=='W'){
    for(int i=1;i<l;i++){
      loc_j--;
      if(coord[loc_i][loc_j]==1)coord[loc_i][loc_j]=0;
    }
  }
}

int main(){
  int N,M;
 
  while(1){
    cin>>N;
    loc_i=10;
    loc_j=10;
    if(N==0)break;

    for(int i=0;i<21;i++){
      for(int j=0;j<21;j++){
	coord[i][j]=0;
      }
    }

    for(int i=0;i<N;i++){
	int x,y;
	cin>>x>>y;
	coord[y][x]=1;
    }

    cin>>M;
    for(int i=0;i<M;i++){
      char c;
      int l;
      cin>>c>>l;
      func_Juge(c,l);
    }

    int flag=1;
    for(int i=0;i<21;i++){
      for(int j=0;j<21;j++){
	if(coord[i][j]!=0){
	  flag=0;
	  break;
	}
      }
    }

    if(flag==0)cout<<"No"<<endl;
    else if(flag==1)cout<<"Yes"<<endl;
  }   

  return 0;
}