【暖*墟】 #C++相关设定# 转义字符

所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。

而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,

如\0,\t,\n等,就称为转义字符。因为后面的字符,都不是它本来的ASCII字符意思了。

所以,如果有关字符“\”的时候,通常用“\\”表示。

【洛谷 p2243】电路维修 的代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<deque> //双端队列
using namespace std;

const int MAXX=550;
int dis[MAXX][MAXX];
bool vis[MAXX][MAXX],Map[MAXX][MAXX];
int dx[4]={1,-1,1,-1};
int dy[4]={1,-1,-1,1}; //矩形中的边的扩展方向
char ss[MAXX];
int t,r,c; 

inline bool checks(int x,int y){ //检查是否到边界
    if(x>=1&&y>=1&&x<=r+1&&y<=c+1) 
    	return true;
    return false;
}

inline int edges(int x,int xx,int y,int yy){
    if((xx<x&&yy<y)||(xx>x&&yy>y))
    	return !Map[min(x,xx)][min(y,yy)];
    else return Map[min(x,xx)][min(y,yy)];
}

inline void bfs(){
    Map[0][0]=1; //广搜起点
    deque< pair < pair<int ,int> ,pair<int ,int > > >q; //二元组队列
    pair<int ,int > u=make_pair(0,0); //原点连向(1,1)
    pair<int ,int > v=make_pair(1,1);
    q.push_back(make_pair(u,v)); //加入一条边(此时只有一条边,无论首尾)
    dis[0][0]=0; //广搜起点
    while(!q.empty()){ //↓↓取出队首
        pair< pair<int ,int > , pair<int ,int > >k=q.front();
        q.pop_front(); //扔出队首
        pair<int ,int >u=k.first; //找出队首边的对应点
        pair<int ,int >v=k.second; //u连向v
        int xx=u.first; int yy=u.second; //表示两点的坐标
        int x=v.first; int y=v.second;
        if(vis[x][y]) continue; //记忆化剪枝(点)
        dis[x][y]=dis[xx][yy]+edges(x,xx,y,yy);
        vis[x][y]=1; //标记
        for(int i=0;i<4;++i){
            int xv=x+dx[i]; int yv=y+dy[i];
            pair<int ,int >s=make_pair(xv,yv);
            if(checks(xv,yv)&&!vis[xv][yv]){
                if(edges(xv,x,yv,y)) q.push_back(make_pair(v,s));
                else q.push_front(make_pair(v,s));
            }
        }
    }
}

int main(){
    scanf("%d",&t);
    while(t--){
        memset(dis,0,sizeof(dis)); //注意清零
   		memset(vis,0,sizeof(vis));
        scanf("%d%d",&r,&c); //矩形长宽
        for(int i=1;i<=r;++i){
            scanf("%s",ss+1); //从字符串1号位开始存
            for(int j=1;j<=c;++j)
            if(ss[j]=='\\') Map[i][j]=1; //【!!!】注意"\"的使用
            else Map[i][j]=0;
        }
        bfs();
        if(vis[r+1][c+1]) printf("%d\n",dis[r+1][c+1]); //到达终点
        else printf("NO SOLUTION\n");
    }
    return 0;
}

转义字符的意义:ASCII码值(十进制)

  • \a:蜂鸣,响铃
  • \b:回退:向后退一格
  • \f:换页
  • \n:换行,光标到下行行首
  • \r:回车,光标到本行行首
  • \t:水平制表
  • \v:垂直制表
  • \\:反斜杠
  • \':单引号
  • \":双引号
  • \?:问号
  • \ddd:三位八进制
  • \xhh:二位十六进制
  • \0:空字符(NULL),什么都不做

注:

1,\v垂直制表和\f换页符对屏幕没有任何影响,但会影响打印机执行响应操作。

2,\n其实应该叫回车换行。换行只是换一行,不改变光标的横坐标;

      回车只是回到行首,不改变光标的纵坐标。

3,\t 光标向前移动四格或八格,可以在编译器里设置

4,\' 在字符里(即单引号里)使用。在字符串里(即双引号里)不需要,只要用 ' 即可。

5,\? 其实不必要。只要用 ? 就可以了(在windows VC6 和tc2 中验证)。 

                                               ——时间划过风的轨迹,那个少年,还在等你。

猜你喜欢

转载自blog.csdn.net/flora715/article/details/82256552