深度优先

这个家伙好懒,除了文章什么都没留下

0%

项目中经常用到发送邮件和忘记密码通过邮件来找回密码等功能。

所以网上找了一下asp.net发送邮件的方法,但是很多教程都有问题,终于弄好了。

一般处理程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Collections.Generic;
using System.Web;
using System.Net.Mail;
using System.Net;
using System.Text;

namespace Pjo.Web.B_S_XHandler
{
/// <summary>
/// post 的摘要说明
/// </summary>
public class post : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
//收件人
string Email = context.Request["Email"].ToString().Trim();
//抄送
string CS = context.Request["CS"].ToString().Trim();
//主题
string ZT = context.Request["ZT"].ToString().Trim();
//正文
string ZW = context.Request["zw"].ToString().Trim();
//附件
string fj = context.Request["fj"].ToString().Trim();

SmtpClient smtp = new System.Net.Mail.SmtpClient();
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.EnableSsl = true;//smtp服
smtp.Host = "smtp.qq.com"; //指定 smtp 服务器地址
smtp.Port = 25;             //指定 smtp 服务器的端口,默认是25,如果采用默认端口
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("415576967@qq.com", "cpxyptgwljkpbhcc");
MailMessage mm = new MailMessage(); //实例化一个邮件类
mm.Priority = MailPriority.Normal; //邮件的优先级,分为 Low, Normal, High,通常用 Normal即可
mm.From = new MailAddress("415576967@qq.com", ZT, System.Text.Encoding.UTF8);
//注:上面的邮件来源,一定要和你登录邮箱的帐号一致,否则会认证失败
mm.ReplyTo = new MailAddress("1439084907@qq.com", "我的接收邮箱", System.Text.Encoding.UTF8);
//ReplyTo 表示对方回复邮件时默认的接收地址,即:你用一个邮箱发信,但却用另一个来收信
//上面后两个参数的意义, 同 From 的意义
if (CS != "")
{
mm.CC.Add(CS);
}
//邮件的抄送者,支持群发,多个邮件地址之间用 半角逗号 分开

mm.To.Add(Email);
//邮件的接收者,支持群发,多个地址之间用 半角逗号 分开
mm.SubjectEncoding = Encoding.GetEncoding(936);
// 这里非常重要,如果你的邮件标题包含中文,这里一定要指定,否则对方收到的极有可能是乱码。
// 936是简体中文的pagecode,如果是英文标题,这句可以忽略不用
mm.IsBodyHtml = true; //邮件正文是否是HTML格式
mm.BodyEncoding = Encoding.GetEncoding(936);
//邮件正文的编码, 设置不正确, 接收者会收到乱码
mm.Body = "<font color='red'>" + ZW + "</font>";
//邮件正文
// mm.Attachments.Add(new Attachment(@"d:新建文本文档.txt", System.Net.Mime.MediaTypeNames.Application.Rtf));
////添加附件,第二个参数,表示附件的文件类型,可以不用指定
////可以添加多个附件
//mm.Attachments.Add(new Attachment(@"d:新建文本文档.txt"));
try
{
smtp.Send(mm); //发送邮件,如果不返回异常, 则大功告成了。
}
catch (Exception)
{
context.Response.Write("0");
}
context.Response.Write("1");
}

public bool IsReusable
{
get
{
return false;
}
}
}
}

标题:九宫重排

如图1的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成图2所示的局面。

我们把图1的局面记为:12345678.
把图2的局面记为:123.46758

显然是按从上到下,从左到右的顺序记录数字,空格记为句点。

本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。

例如:
输入数据为:
12345678.
123.46758
则,程序应该输出:
3

再如:
输入:
13524678.
46758123.
则,程序输出:
22

资源约定:
峰值内存消耗(含虚拟机) < 64M

CPU消耗 < 2000ms

bfs搜索的一道非常典型题目,写得有点啰嗦!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
 /**
*
*/
package D1;

import java.util.HashSet;
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
import java.util.Set;

/**
* @作者: gx_143
* @创建时间: 2017-5-19上午11:31:28
*/
public class T8 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
String str=sc.nextLine();
String stop=sc.nextLine();
stop=stop.substring(0,3)+"@"+stop.substring(3,6)+"@"+stop.substring(6,9);
//System.out.println(stop);
char[] begin=new char[11];
int index=0,X=0;
for (int i = 0; i < begin.length; i++) {
if(i==3||i==7){
begin[i]='@';
}else{
begin[i]=str.charAt(index);
index++;
if(begin[i]=='.'){
X=i;
}
}
}
f(begin,stop,X);
}

/**
* @param begin
* @param stop
* @param x
*/
static int[] fx=new int[]{1,-1,4,-4};
private static void f(char[] begin, String stop, int x) {

Queue<Node> queue=new LinkedList<Node>();
Node node=new Node(begin,x,0);
Set testSet = new HashSet();

String start1=new String(begin);
queue.add(node);
testSet.add(start1);

while(!queue.isEmpty()){
Node notNode=queue.poll();
char[] ch=notNode.ch;
int xnext=notNode.x;
int sum=notNode.sum;

for (int i = 0; i < fx.length; i++) {
int next=xnext+fx[i];

if(next>=0&&next<11&&next!=3&&next!=7){

char[] cc=new char[11];
for (int j = 0; j < cc.length; j++) {
cc[j]=ch[j];
}

char t=cc[xnext];
cc[xnext]=cc[next];
cc[next]=t;

String sta=new String(cc);
int size1=testSet.size();
testSet.add(sta);
int size2=testSet.size();

if(size1!=size2){
Node newNode=new Node(cc,next,sum+1);
queue.add(newNode);
}
}
}
String start=new String(ch);
//System.out.println(start);
if(start.equals(stop)){
System.out.println(sum);
return;
}
}
}

public static class Node{
public char[] ch;
public int x;
public int sum;
public Node(char[] ch,int x,int sum){
this.ch=ch;
this.x=x;
this.sum=sum;
}
}
}

魔方可以对它的6个面自由旋转。

我们来操作一个2阶魔方(如图1所示):
为了描述方便,我们为它建立了坐标系。

各个面的初始状态如下:
x轴正向:绿
x轴反向:蓝
y轴正向:红
y轴反向:橙
z轴正向:白
z轴反向:黄

假设我们规定,只能对该魔方进行3种操作。分别标记为:
x 表示在x轴正向做顺时针旋转
y 表示在y轴正向做顺时针旋转
z 表示在z轴正向做顺时针旋转

xyz 则表示顺序执行x,y,z 3个操作

题目的要求是:
用户从键盘输入一个串,表示操作序列。
程序输出:距离我们最近的那个小方块的3个面的颜色。
顺序是:x面,y面,z面。

例如:在初始状态,应该输出:
绿红白

初始状态下,如果用户输入:
x
则应该输出:
绿白橙

初始状态下,如果用户输入:
zyx
则应该输出:

红白绿


这个题就比较有意思,之前会玩三阶魔方和四阶魔方,怎么能被这二阶魔方给难倒呢?

于是就这样模拟做了。

代码,有点多:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
*
*/
package D1;

import java.util.Scanner;

/**
* @作者: gx_143
* @创建时间: 2017-5-16下午07:12:34
*/
public class D4 {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] x=new char[]{'绿','绿','绿','绿'};
char[] z=new char[]{'白','白','白','白'};
char[] y=new char[]{'红','红','红','红'};

char[] xf=new char[]{'蓝','蓝','蓝','蓝'};
char[] zf=new char[]{'黄','黄','黄','黄'};
char[] yf=new char[]{'橙','橙','橙','橙'};

Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String str=sc.nextLine();

for (int i = 0; i < str.length(); i++) {
f(x,y,z,xf,yf,zf,str.charAt(i));
}
System.out.println(x[0]+""+y[0]+""+z[0]+"");
}
}

private static void f(char[] x, char[] y, char[] z, char[] xf, char[] yf,
char[] zf, char c) {

if(c=='x'){
{
char t=x[0];
x[0]=x[3];
x[3]=x[2];
x[2]=x[1];
x[1]=t;
}
{
char t=z[0];
z[0]=yf[0];
yf[0]=zf[0];
zf[0]=y[1];
y[1]=t;
}
{
char t=z[1];
z[1]=yf[1];
yf[1]=zf[1];
zf[1]=y[0];
y[0]=t;
}
}else if(c=='y'){
{
char t=y[0];
y[0]=y[3];
y[3]=y[2];
y[2]=y[1];
y[1]=t;
}
{
char t=z[0];
z[0]=x[1];
x[1]=zf[2];
zf[2]=xf[1];
xf[1]=t;
}
{
char t=z[3];
z[3]=x[0];
x[0]=zf[1];
zf[1]=xf[0];
xf[0]=t;
}
}else{
{
char t=z[0];
z[0]=z[3];
z[3]=z[2];
z[2]=z[1];
z[1]=t;
}
{
char t=xf[1];
xf[1]=yf[3];
yf[3]=x[3];
x[3]=y[0];
y[0]=t;
}
{
char t=xf[2];
xf[2]=yf[0];
yf[0]=x[0];
x[0]=y[3];
y[3]=t;
}
}
}
}