posts - 14,  comments - 11,  trackbacks - 0

设计要求:

设计要求实现如下功能:

1)设计实现一个连连看游戏;

2)玩家选择两个相同的棋子则两棋子同时消去,可消去的子之间应该能连通,且连接时拐角不能超过两个;

3)当玩家找不到相应棋子时,玩家输入“?? ??”,系统应该提示可消去的棋子位置;

4)棋盘面积至少为20x20,中间应该空出大约10%~20%的空间用‘-’表示。棋子用大写字母ABCD表示。(提示:棋子种类不宜太多,且每种为偶数);

这是一个比较简单的搜索问题。
比如说:game[i][j];按其四个方向进行搜索,在i和j上的标号为1,表示没有拐角,在对1周围四个方向进行展开并标为2,表示有一个拐点;再对为2的拐点展开,同样的标为3,表示经过两次拐角能够到达!其他的点为0;
if(game[i][j]==0)return false;//表示不能找到这样的点
if(game[i][j]>0&&game[i][j]<4)return true;//表示可以找到这样的点


下面是关键部分的代码,如有错误,请高手指点
 bool search(int x1,int y1,int x2,int y2)
 
2 {
 
3       memset(gk,0,sizeof(gk));
 
4       char t=game[x2][y2];
 
5       game[x2][y2]=' ';
 
6       gk[x1][y1]=1;
 
7       //对game[x1][y1]四个方向是空格的标为1 
 8       for (int i=x1-1;i>=0;i--){
 
9             if(game[i][y1]==' ')gk[i][y1]=1;
10             else  break;
11          }
12      for (int j=x1+1;j<26;j++){
13               if(game[j][y1]==' ')gk[j][y1]=1;
14               else break;
15            }
16     
17      for (int i=y1-1;i>=0;i--){
18           if(game[x1][i]==' ')gk[x1][i]=1;
19          else  break;
20          } 
21      for (int i=y1+1;i<26;i++){
22           if(game[x1][i]==' ')gk[x1][i]=1;
23          else  break;
24          } 
25    
26     //对gk[i][j]为1的四个方向是空格的标为2 
27     for (int i=1;i<26;i++)
28     for (int j=1;j<26;j++)
29          if  (gk[i][j]==1){
30                for (int k=i-1;k>=0;k--){
31                 if  (game[k][j]==' '){
32                     if(gk[k][j]==0)gk[k][j]=2;
33                     }
34                 else break;
35                 }             
36             for (int k=i+1;k<26;k++){
37                 if  (game[k][j]==' '){
38                      if(gk[k][j]==0)gk[k][j]=2;
39                     }
40                  else break;       
41                 }
42             
43             for (int k=j-1;k>=0;k--){
44                 if  (game[i][k]==' '){
45                      if(gk[i][k]==0)gk[i][k]=2;
46                     }
47                  else break;       
48                 }
49             for (int k=j+1;k<26;k++){
50                 if  (game[i][k]==' '){
51                      if(gk[i][k]==0)gk[i][k]=2;
52                     }
53                  else break;       
54                 }
55          }
56     //对gk[i][j]为2的四个方向是空格的标为3
57     for (int i=1;i<26;i++)
58     for (int j=1;j<26;j++)
59     if  (gk[i][j]==2){
60         for (int k=i-1;k>=0;k--){
61                 if  (game[k][j]==' '){
62                     if(gk[k][j]==0)gk[k][j]=3;
63                     }
64                 else break;
65                 }             
66             for (int k=i+1;k<26;k++){
67                 if  (game[k][j]==' '){
68                      if(gk[k][j]==0)gk[k][j]=3;
69                     }
70                  else break;       
71                 }
72             
73             for (int k=j-1;k>=0;k--){
74                 if  (game[i][k]==' '){
75                      if(gk[i][k]==0)gk[i][k]=3;
76                     }
77                  else break;       
78                 }
79             for (int k=j+1;k<26;k++){
80                 if  (game[i][k]==' '){
81                      if(gk[i][k]==0)gk[i][k]=3;
82                     }
83                  else break;       
84                 }
85           }       
86                    
87          game[x2][y2]=t;
88          if(gk[x2][y2]>0&&gk[x2][y2]<4)return true;//如果连同且拐角不超过两个,返回true 
89          if(gk[x2][y2]==0return false;  //否则返回false 
90       }
posted @ 2010-06-18 13:10 路修远 阅读(2887) | 评论 (1)编辑 收藏

                                

                                                                                                                         

词组缩写

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2256    Accepted Submission(s): 685

Problem Description
定义:一个词组中每个单词的首字母的大写组合称为该词组的缩写。
比如,C语言里常用的EOF就是end of file的缩写。
 

Input
输入的第一行是一个整数T,表示一共有T组测试数据;
接下来有T行,每组测试数据占一行,每行有一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词有一个或多个大写或小写字母组成;
单词长度不超过10,由一个或多个空格分隔这些单词。
 

Output
请为每组测试数据输出规定的缩写,每组输出占一行。
 

Sample Input
1 end of file

Sample Output
EOF

wa 了几次,终于~~ac了。有一些小问题要考虑......呵呵
 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 char change(char c)
 5 {
 6       if(c>='a'&&c<='z')return (c-32);
 7       else if(c>='A'&&c<='Z')return c;
 8        }
 9 int main(){
10     int t;
11     char a[200];
12     cin>>t;
13     getchar();
14     for (int j=0;j<t;j++)
15     {
16             gets(a);
17             int n = strlen(a);
18            if(n==1)cout<<change(a[0])<<endl;
19            else {
20                   for (int i=1;i<n;i++)
21                   {
22                          if(a[i-1]==' '&&a[i]!=' ')   cout<<change(a[i]);
23                         if(a[i-1]!=' '&&i==1)           cout<<change(a[i-1]);    
24                        }
25                  cout<<endl;
26                  }         
27            memset(a,0,sizeof(a));           
28            }    
29     return 0;
30     }
31 
posted @ 2010-06-11 22:23 路修远 阅读(2229) | 评论 (0)编辑 收藏

                                             {A} + {B}

                                    
Problem : 1412 ( {A} + {B} )     Judge Status : Accepted
RunId : 2507648    Language : G++    Author : luxiuyuan
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta


Problem Description
给你两个集合,要求{A} + {B}.
注:同一个集合中不会有两个相同的元素.
 

Input
每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.
 

Output
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.
 

Sample Input
1 2 1 2 3 1 2 1 1 2
 

Sample Output
1 2 3 1 2

呵呵~~这是一个简单的问题:
 1 #include<iostream>
 2 using namespace std;
 3 int main(){
 4     int a[20003];
 5     int n,m;
 6     while (cin>>n>>m)
 7     {
 8            memset(a,0,sizeof(a));
 9            int i=0,j=0;
10            for (i=0;i<n;i++)
11            cin>>a[i];
12            for (j=0;j<m;i++,j++)
13            cin>>a[i];
14            sort(a,a+i);
15            int f = 0;
16            for (j=0;j<i;j++)
17            {
18                  if(a[j]==a[j+1])continue;
19                  if(a[j]!=a[j+1]) f++;
20                   if(f>1)cout<<' ';
21                cout<<a[j];
22                 }
23            cout<<endl;
24            }
25     return 0;
26     }
27 


posted @ 2010-06-11 10:15 路修远 阅读(1556) | 评论 (0)编辑 收藏
仅列出标题
共2页: 1 2 
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

转载,请标明出处!谢谢~~

常用链接

留言簿(1)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

  • 1. re: HDU 2433 最短路
  • @test
    的确这组数据应该输出20的
  • --YueYueZha
  • 2. re: HDU 2433 最短路
  • 这方法应该不对。 看下面这组数据
    4 4
    1 2
    2 3
    3 4
    2 4

    画个图,删去最后一条边 2 4 后的结果应该是20,但是此方法的输出是19
  • --test
  • 3. re: HDU 2433 最短路
  • ans = ans + sum_u + sum_v - sum[u] - sum[v],
    这个公式不是很理解啊,不知道博主怎么想的啊,谢谢咯
  • --姜
  • 4. re: HDU 2433 最短路
  • @attacker
    the i-th line is the new SUM after the i-th road is destroyed
  • --路修远
  • 5. re: HDU 2433 最短路
  • 你这样可以AC????删除<U,V>不仅改变 u,v最短路啊、、、求解
  • --attacker

阅读排行榜

评论排行榜