| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3358 人关注过本帖
标题:求200行代码的C题目
只看楼主 加入收藏
蓝一
Rank: 1
等 级:新手上路
帖 子:54
专家分:0
注 册:2007-5-25
收藏
得分:0 
都太有才了
2008-06-03 22:31
無邪的睡脸
Rank: 2
等 级:等待验证会员
威 望:1
帖 子:344
专家分:13
注 册:2007-9-11
收藏
得分:0 
实在是高
2008-06-04 10:20
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
写个图论的东西应该够了...

学习需要安静。。海盗要重新来过。。
2008-06-04 10:38
small01
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-6-4
收藏
得分:0 
一个圆形的图~


#include "graphics.h"
#include "math.h"
#include "dos.h"
#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
#include "stdarg.h"

#define MAXPTS 15
#define PI 3.1415926

struct PTS
{
int x,y;
};
double AspectRatio=0.85;
void LineToDemo(void)
{
  struct viewporttype vp;
  struct PTS points[MAXPTS];
  int i, j, h, w, xcenter, ycenter;
  int radius, angle, step;
  double rads;
  printf(" MoveTo / LineTo Demonstration" );
  getviewsettings( &vp );
  h = vp.bottom - vp.top;
  w = vp.right - vp.left;
  xcenter = w / 2; /* Determine the center of circle */
  ycenter = h / 2;
  radius = (h - 30) / (AspectRatio * 2);
  step = 360 / MAXPTS; /* Determine # of increments */
  angle = 0; /* Begin at zero degrees */
  for( i=0 ; i<MAXPTS ; ++i )
  { /* Determine circle intercepts */
    rads = (double)angle * PI / 180.0; /* Convert angle to radians */
    points[i].x = xcenter + (int)( cos(rads) * radius );
    points[i].y = ycenter - (int)( sin(rads) * radius * AspectRatio );
    angle += step; /* Move to next increment */
  }
  circle( xcenter, ycenter, radius ); /* Draw bounding circle */
  for( i=0 ; i<MAXPTS ; ++i )
  { /* Draw the cords to the circle */
    for( j=i ; j<MAXPTS ; ++j )
    { /* For each remaining intersect */
      moveto(points[i].x, points[i].y); /* Move to beginning of cord */
      lineto(points[j].x, points[j].y); /* Draw the cord */
    }
  }
}
main()
{
  int driver,mode;
  driver=CGA;mode=CGAC0;
  initgraph(&driver,&mode,"");
  setcolor(3);
  setbkcolor(GREEN);
  LineToDemo();
  getch();
}
2008-06-04 10:57
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
我支持四楼
给个例子给你
void main()
{
    int i;
    int N;
    int s=0;
    printf("Please into a number N:");
    scanf("%d",&N);
    for(i=1; i<=N; i++)
    {
        s=s+i;
    }
    printf("The end number is:%d",s);
}

[[it] 本帖最后由 liyanhong 于 2008-6-4 11:44 编辑 [/it]]

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-06-04 11:43
小亨亨
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-06-04 12:17
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
程序代码:
#include<stdio.h>
int main(void)
{
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    {
        ;
    }
    printf("Hello! world!\n");
    return 0;
}

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-06-04 12:18
Loli
Rank: 1
来 自:飞燕算法群46520219
等 级:新手上路
帖 子:348
专家分:0
注 册:2008-5-27
收藏
得分:0 
我的控制台版扫雷游戏写了四百行


" border="0" />[color=white]
2008-06-04 12:19
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
程序代码:
/*
  Author: Sun Kai (S.K)
  E-mail: sunkai [at] msn [dot] com
  QICQ  : 674456991
*/
/*
  欢迎光临:http://program.*/
/*
  通过pascal.h头文件可以成功编译并运行通过本程序
  此代码直接编译无法通过,只是一个伪代码(类C-Pascal描述)         
  若转载请先得到本人允许,请勿抄袭 
  原创代码,本人保留本代码最终解释权                     
  代码仅提供参考,代码中无核心删减,但部分注释和中文已略 
*/

#include"pascal.h" /*类pascal代码支持*/ 
#include<stdio.h>
#include<string.h>
#include<time.h>

program sudoku;

/*#define user*/
struct
begin 
      integer ok[10];
      integer num; 
      integer left;
end x[10][10];
integer s[3][10][10];
integer v[10][10]; 
integer work(integer i,integer j)
begin 
    integer k,l;
    if(x[i][j].num)
    begin 
        for(k=1;k<10;inc(k))
        begin 
              if(x[i][k].ok[x[i][j].num])
              begin 
                x[i][k].ok[x[i][j].num]=0;
                dec(x[i][k].left);
              end 
              if(x[k][j].ok[x[i][j].num])
              begin 
                x[k][j].ok[x[i][j].num]=0;
                dec(x[k][j].left);
              end 
        end 
        for(k=(i-1)/3*3+1;k<(i-1)/3*3+4;inc(k))
            for(l=(j-1)/3*3+1;l<(j-1)/3*3+4;inc(l))
            begin 
                if(x[k][l].ok[x[i][j].num])
                begin 
                  x[k][l].ok[x[i][j].num]=0;
                  dec(x[k][l].left);
                end 
            end 
        x[i][j].left=0;
    end 
end 
integer cuts()
begin 
    integer i,j,k;
    fillchar(s,0,sizeof(s));
    for(i=1;i<10;inc(i))
    begin 
      for(j=1;j<10;inc(j))
        for(k=1;k<10;inc(k))
        begin 
          if(x[i][j].ok[k])
          begin 
            inc(s[0][i][k]);
            inc(s[1][j][k]);
            inc(s[2][(i-1)/3*3+(j-1)/3+1][k]);
          end 
        end 
    end 
end 
integer search()
begin 
    integer i,j,k,l,m,n,o,p,q; /* Temp var */
    integer count;
    integer flag=0;
    integer list[3];
    integer r[2][10];
    cpas(flag);
    for(i=1;i<10;inc(i))
    begin 
      for(j=1;j<10;inc(j))
        for(k=1;k<j;inc(k))
        begin 
          if(x[i][j].left==2 && x[i][k].left==2 && memcmp(x[i][k].ok,x[i][j].ok,sizeof(x[i][k].ok))==0)
          begin 
            for(l=1;l<10;inc(l))
              if(x[i][j].ok[l])
              begin 
                for(m=1;m<10;inc(m))
                begin 
                  if(x[i][m].ok[l] && m!=j && m!=k)
                  begin 
                    x[i][m].ok[l]=0;
                    dec(x[i][m].left);
                    write("由于数%d是[%c,%d],[%c,%d]只存在两个相同的后选数中的一个,由此数%d不可能在[%c,%d]\n",l,i+'A'-1,k,i+'A'-1,j,l,i+'A'-1,m);
                    inc(flag); 
                  end 
                end 
                #ifdef user
                if(flag) return flag;
                #endif
              end 
          end 
          if(x[j][i].left==2 && x[k][i].left==2 && memcmp(x[j][i].ok,x[k][i].ok,sizeof(x[j][i].ok))==0)
          begin 
            for(l=1;l<10;inc(l))
              if(x[j][i].ok[l])
              begin 
                for(m=1;m<10;inc(m))
                begin 
                  if(x[m][i].ok[l] && m!=j && m!=k)
                  begin 
                    x[m][i].ok[l]=0;
                    dec(x[m][i].left);
                    write("由于数%d是[%c,%d],[%c,%d]只存在两个相同的后选数中的一个,由此数%d不可能在[%c,%d]\n",l,k+'A'-1,i,j+'A'-1,i,l,m+'A'-1,i);
                    inc(flag);
                  end 
                end 
                #ifdef user
                if(flag) return flag;
                #endif
              end  
          end 
        end 
    end 
    for(i=0;i<9;i+=3)
      for(j=0;j<9;j+=3)
      begin 
        for(k=1;k<4;inc(k))
          for(l=1;l<4;inc(l))
            for(m=1;m<=k;inc(m))
              for(n=1;n<=l;inc(n))
              begin 
                if(x[i+k][j+l].left==2 && x[i+m][j+n].left==2 && memcmp(x[i+k][j+l].ok,x[i+m][j+n].ok,sizeof(x[i+k][j+l].ok))==0 && !(k==m && l==n))
                begin 
                  for(o=1;o<10;inc(o))
                  begin 
                    if(x[i+k][j+l].ok[o])
                    begin 
                      for(p=1;p<4;inc(p))
                        for(q=1;q<4;inc(q))
                        begin 
                          if(x[i+p][j+q].ok[o] && !(p==m && q==n) && !(p==k && q==l))
                          begin 
                            x[i+p][j+q].ok[o]=0;
                            dec(x[i+p][j+q].left);
                            write("由于数%d是[%c,%d],[%c,%d]只存在两个相同的后选数中的一个,由此数%d不可能在[%c,%d]\n",o,i+m+'A'-1,j+n,i+k+'A'-1,j+l,o,i+p+'A'-1,j+q);
                            inc(flag);
                          end 
                        end 
                    end 
                  end 
                  #ifdef user
                  if(flag) return flag;
                  #endif
                end 
              end 
      end               
    for(i=1;i<10;inc(i))
    begin 
      for(m=0;m<9;m+=3)
      begin 
        fillchar(r,0,sizeof(r));
        for(j=1+m;j<4+m;inc(j))
        begin 
          for(k=1;k<10;inc(k))
          begin 
            if(x[i][j].ok[k])
              inc(r[0][k]);
            if(x[j][i].ok[k])
              inc(r[1][k]);
          end 
        end 
        for(j=1;j<10;inc(j))
        begin 
            if(r[0][j]==s[0][i][j] && r[0][j]!=0 && r[0][j]!=s[2][(i-1)/3*3+(m)/3+1][j])
            begin 
              for(k=(i-1)/3*3+1;k<(i-1)/3*3+4;inc(k))
              begin 
                for(l=1+m;l<4+m;inc(l))
                begin 
                  if(k!=i)
                  begin 
                    if(x[k][l].ok[j])
                    begin 
                      x[k][l].ok[j]=0;
                      dec(x[k][l].left);
                      write("由于%c行与同本行相交的第%d个九宫的公共区域是本行有且只有可能填%d的区域,由此数%d不可能在[%c,%d]\n",i+'A'-1,m/3+1,j,j,k+'A'-1,l);
                      inc(flag);
                    end 
                  end 
                end 
              end 
              #ifdef user
              if(flag) return flag;
              #endif
            end 
            if(r[0][j]==s[2][(i-1)/3*3+(m)/3+1][j] && r[0][j]!=0 && r[0][j]!=s[0][i][j])
            begin 
              for(k=1;k<10;inc(k))
              begin 
                if(k<=m || k>m+3)
                begin 
                  if(x[i][k].ok[j])
                  begin 
                    x[i][k].ok[j]=0;
                    dec(x[i][k].left);
                    write("由于%c行与同本行相交的第%d个九宫的公共区域是此九宫中有且只有可能填%d的区域,由此数%d不可能在[%c,%d]\n",i+'A'-1,m/3+1,j,j,i+'A'-1,k);
                    inc(flag);
                  end 
                end 
              end 
              #ifdef user
              if(flag) return flag;
              #endif
            end  
            if(r[1][j]==s[1][i][j] && r[1][j]!=0 && r[1][j]!=s[2][(m)/3*3+(i-1)/3+1][j])
            begin 
              for(k=(i-1)/3*3+1;k<(i-1)/3*3+4;inc(k))
              begin 
                for(l=1+m;l<4+m;inc(l))
                begin 
                  if(k!=i)
                  begin 
                    if(x[l][k].ok[j])
                    begin 
                      x[l][k].ok[j]=0;
                      dec(x[l][k].left);
                      write("由于%d列与同本列相交的第%d个九宫的公共区域是本列有且仅有可能填%d的区域,由此数%d不可能在[%c,%d]\n",i,m/3+1,j,j,l+'A'-1,k);
                      inc(flag);
                    end 
                  end 
                end 
              end 
              #ifdef user
              if(flag) return flag;
              #endif
            end 
            if(r[1][j]==s[2][(m)/3*3+(i-1)/3+1][j] && r[1][j]!=0 && r[1][j]!=s[1][i][j])
            begin 
              for(k=1;k<10;inc(k))
              begin 
                if(k<=m || k>m+3)
                begin 
                  if(x[k][i].ok[j])
                  begin 
                    x[k][i].ok[j]=0;
                    dec(x[k][i].left);
                    write("由于%d列与同本列相交的第%d个九宫的公共区域是此九宫中有且仅有可能填%d的区域,由此数%d不可能在[%c,%d]\n",i,m/3+1,j,j,k+'A'-1,i);
                    inc(flag);
                  end 
                end 
              end 
              #ifdef user
              if(flag) return flag;
              #endif
            end 
        end 
      end 
    end 
    for(i=1;i<10;inc(i))
    begin 
      for(j=1;j<10;inc(j))
      begin 
        if(x[i][j].left==1)
        begin 
              for(k=1;k<10;inc(k)) if(x[i][j].ok[k]) break;
              x[i][j].num=k;
              inc(flag); work(i,j);
              write("在[%c,%d]中只能填%d\n",i+'A'-1,j,k); 
              #ifdef user
              if(flag) return flag;
              #endif
        end 
        else
        begin 
              for(k=1;k<10;inc(k))
              begin 
                list[0]=s[0][i][k];
                list[1]=s[1][j][k];
                list[2]=s[2][(i-1)/3*3+(j-1)/3+1][k];
                for(l=0;l<3;inc(l))
                  if(list[l]==1 && x[i][j].ok[k])
                  begin 
                    fillchar(x[i][j].ok,0,sizeof(x[i][j].ok));
                    x[i][j].num=k; x[i][j].ok[k]=-1;
                    inc(flag); work(i,j);
                    write("在[%c,%d]所在的%s仅可填 %d\n",i+'A'-1,j,l==0 ? "行" : l==1 ? "列" : "九宫",k);
                    #ifdef user
                    if(flag) return flag;
                    #endif
                    goto next; 
                  end 
              end 
        end 
        next: ;
      end 
    end 
    return flag;
end 
integer can(integer a,integer b)
begin 
    integer i,j;
    integer ta,tb;
    ta=(a-1)/3*3;
    tb=(b-1)/3*3;
    for(i=1;i<10;inc(i))
    begin 
      if(x[i][b].num==x[a][b].num && i!=a) return 0;
      if(x[a][i].num==x[a][b].num && i!=b) return 0;
    end 
    for(i=ta+1;i<ta+4;inc(i))
      for(j=tb+1;j<tb+4;inc(j))
        if(x[i][j].num==x[a][b].num && !(i==a && j==b)) return 0; 
    return 1;
end 
integer dfs(integer a,integer b)
begin 
    integer i,j,t;
    if(a==10)
    begin 
        return 1;
    end 
    if(!x[a][b].num)
    begin 
      for(i=1;i<10;inc(i))
      begin 
        if(x[a][b].ok[i])
        begin 
          x[a][b].num=i;
          if(can(a,b))
          begin 
            if(dfs(a+b/9,b%9+1))
            begin 
              return 1;
            end 
          end 
          x[a][b].num=0;
        end 
      end 
    end 
    else
      if(dfs(a+b/9,b%9+1)) return 1;
    return 0;
end         
void output(integer ok,integer s_ok,integer black)
begin 
    integer i,j,k,l;
    char number[10][3]=begin "0","1","2","3","4","5","6","7","8","9"end ; 
    if(black)
    begin 
      for(i=0;i<20;inc(i))
      begin 
        write("\n");
      end 
    end 
    write("      ");
    for(j=1;j<10;inc(j))
        write("%d       ",j);
    write("\n\n");
    for(i=1;i<10;inc(i))
    begin 
      write("%c     ",'A'+i-1);
      for(j=1;j<10;inc(j))
        write("%s      ",number[x[i][j].num]);
      write("\n");
      /*输出可能情况*/
      if(ok)
      begin 
        write("      ");
        for(j=1;j<10;inc(j))
        begin 
          l=0;
          for(k=1;k<10;inc(k))
            if(x[i][j].ok[k])
            begin 
             write("%d",k);
             inc(l);
            end 
          for(k=0;k<8-l;inc(k)) write(" ");
        end 
        write("\n\n");
      end 
    end 
    if(s_ok)
    begin 
      for(i=0;i<3;inc(i))
      begin 
          write("s[%d]:\n",i);
          for(j=1;j<10;inc(j))
          begin 
            for(k=1;k<10;inc(k)) write("%d ",s[i][j][k]);
            write("\n");
          end 
      end 
    end 
end
integer main(void)
begin 
    integer i,j,k,l;
    longint runtime,flag;
    fillchar(x,0,sizeof(x));
    for(i=1;i<10;inc(i))
    begin 
      for(j=1;j<10;inc(j))
      begin 
        read("%1d",&x[i][j].num);
        if(!x[i][j].num)
          fillchar(x[i][j].ok,-1,sizeof(x[i][j].ok));
      end 
    end 
    runtime=clock();
    for(i=1;i<10;inc(i))
      for(j=1;j<10;inc(j)) work(i,j);
    for(i=1;i<10;inc(i))
      for(j=1;j<10;inc(j))
      begin 
        x[i][j].left=0;
        for(l=1;l<10;inc(l))
          if(x[i][j].ok[l]) inc(x[i][j].left);
      end 
    do
    begin 
        #ifdef user
        getch();
        output(1,0,1);
        #endif
        cuts();
    end while(search());
    /*=================================*/
    /*输出部分*/ 
    write("结束\n");
    flag=1;
    for(i=1;i<10;inc(i))
      for(j=1;j<10;inc(j))
        if(!x[i][j].num) begin  flag=0; break; end 
    write("推理解答%s\n",flag ? "成功" : "失败");
    if(!flag)
    begin 
             write("继推理后进行搜索解答\n");
             if(dfs(1,1)) write("搜索解答成功\n");
             else write("搜索解答失败\n"); 
    end 
    output(0,0,0);
    runtime=clock()-runtime;
    write("Total time: %dms\n",runtime);
    /*=================================*/
    while(1);
    return 0;
end 


My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-06-04 12:20
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
/******************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) [url=http://]http://[/url] **
*****************************************************************/
/*
    Author: Sun Kai (S.K)
    E-mail: sunkai [at] msn [dot] com
    QICQ  : 674456991
*/
/*
    欢迎光临:[url=http://program.]http://program.[/url]
*/
/*
    通过pascal.h头文件可以成功编译并运行通过本程序
    此代码直接编译无法通过,只是一个伪代码(类C-Pascal描述)         
    若转载请先得到本人允许,请勿抄袭
    原创代码,本人保留本代码最终解释权                     
    代码仅提供参考,代码中无核心删减,但部分注释和中文已略
*/
#include"pascal.h" /*类pascal代码支持*/
#include<stdio.h>
#include<string.h>
#include<time.h>
program sudoku;
/*#define user*/
struct
begin
        
integer ok[10];
        integer num;
        integer left;
end x[10][10];
integer s[3][10][10];
integer v[10][10];
integer work(integer i,integer j)
begin
   
integer k,l;
    if(x[i][j].num)
    begin
        
for(k=1;k<10;inc(k))
        begin
               
if(x[i][k].ok[x[i][j].num])
                begin
               
x[i][k].ok[x[i][j].num]=0;
                dec(x[i][k].left);
                end
               
if(x[k][j].ok[x[i][j].num])
                begin
               
x[k][j].ok[x[i][j].num]=0;
                dec(x[k][j].left);
                end
        end
        
for(k=(i-1)/3*3+1;k<(i-1)/3*3+4;inc(k))
            for(l=(j-1)/3*3+1;l<(j-1)/3*3+4;inc(l))
            begin
               
if(x[k][l].ok[x[i][j].num])
                begin
                    
x[k][l].ok[x[i][j].num]=0;
                    dec(x[k][l].left);
                end
            end
        
x[i][j].left=0;
    end
end
integer cuts()
begin
   
integer i,j,k;
    fillchar(s,0,sizeof(s));
    for(i=1;i<10;inc(i))
    begin
        
for(j=1;j<10;inc(j))
        for(k=1;k<10;inc(k))
        begin
            
if(x[i][j].ok[k])
            begin
            
inc(s[0][i][k]);
            inc(s[1][j][k]);
            inc(s[2][(i-1)/3*3+(j-1)/3+1][k]);
            end
        end
    end
end
integer search()
begin
   
integer i,j,k,l,m,n,o,p,q; /* Temp var */
   
integer count;
    integer flag=0;
    integer list[3];
    integer r[2][10];
    cpas(flag);
    for(i=1;i<10;inc(i))
    begin
        
for(j=1;j<10;inc(j))
        for(k=1;k<j;inc(k))
        begin
            
if(x[i][j].left==2 && x[i][k].left==2 && memcmp(x[i][k].ok,x[i][j].ok,sizeof(x[i][k].ok))==0)
            begin
            
for(l=1;l<10;inc(l))
                if(x[i][j].ok[l])
                begin
               
for(m=1;m<10;inc(m))
                begin
                    
if(x[i][m].ok[l] && m!=j && m!=k)
                    begin
                    
x[i][m].ok[l]=0;
                    dec(x[i][m].left);
                    write("由于数%d是[%c,%d],[%c,%d]只存在两个相同的后选数中的一个,由此数%d不可能在[%c,%d]\n",l,i+'A'-1,k,i+'A'-1,j,l,i+'A'-1,m);
                    inc(flag);
                    end
                end
               
#ifdef user
                if(flag) return flag;
                #endif
               
end
            end
            
if(x[j][i].left==2 && x[k][i].left==2 && memcmp(x[j][i].ok,x[k][i].ok,sizeof(x[j][i].ok))==0)
            begin
            
for(l=1;l<10;inc(l))
                if(x[j][i].ok[l])
                begin
               
for(m=1;m<10;inc(m))
                begin
                    
if(x[m][i].ok[l] && m!=j && m!=k)
                    begin
                    
x[m][i].ok[l]=0;
                    dec(x[m][i].left);
                    write("由于数%d是[%c,%d],[%c,%d]只存在两个相同的后选数中的一个,由此数%d不可能在[%c,%d]\n",l,k+'A'-1,i,j+'A'-1,i,l,m+'A'-1,i);
                    inc(flag);
                    end
                end
               
#ifdef user
                if(flag) return flag;
                #endif
               
end  
            end
        end
    end
   
for(i=0;i<9;i+=3)
        for(j=0;j<9;j+=3)
        begin
        
for(k=1;k<4;inc(k))
            for(l=1;l<4;inc(l))
            for(m=1;m<=k;inc(m))
                for(n=1;n<=l;inc(n))
                begin
               
if(x[i+k][j+l].left==2 && x[i+m][j+n].left==2 && memcmp(x[i+k][j+l].ok,x[i+m][j+n].ok,sizeof(x[i+k][j+l].ok))==0 && !(k==m && l==n))
                begin
                    
for(o=1;o<10;inc(o))
                    begin
                    
if(x[i+k][j+l].ok[o])
                    begin
                        
for(p=1;p<4;inc(p))
                        for(q=1;q<4;inc(q))
                        begin
                           
if(x[i+p][j+q].ok[o] && !(p==m && q==n) && !(p==k && q==l))
                            begin
                           
x[i+p][j+q].ok[o]=0;
                            dec(x[i+p][j+q].left);
                            write("由于数%d是[%c,%d],[%c,%d]只存在两个相同的后选数中的一个,由此数%d不可能在[%c,%d]\n",o,i+m+'A'-1,j+n,i+k+'A'-1,j+l,o,i+p+'A'-1,j+q);
                            inc(flag);
                            end
                        end
                    end
                    end
                    
#ifdef user
                    if(flag) return flag;
                    #endif
               
end
                end
        end               
   
for(i=1;i<10;inc(i))
    begin
        
for(m=0;m<9;m+=3)
        begin
        
fillchar(r,0,sizeof(r));
        for(j=1+m;j<4+m;inc(j))
        begin
            
for(k=1;k<10;inc(k))
            begin
            
if(x[i][j].ok[k])
                inc(r[0][k]);
            if(x[j][i].ok[k])
                inc(r[1][k]);
            end
        end
        
for(j=1;j<10;inc(j))
        begin
            
if(r[0][j]==s[0][i][j] && r[0][j]!=0 && r[0][j]!=s[2][(i-1)/3*3+(m)/3+1][j])
            begin
               
for(k=(i-1)/3*3+1;k<(i-1)/3*3+4;inc(k))
                begin
               
for(l=1+m;l<4+m;inc(l))
                begin
                    
if(k!=i)
                    begin
                    
if(x[k][l].ok[j])
                    begin
                        
x[k][l].ok[j]=0;
                        dec(x[k][l].left);
                        write("由于%c行与同本行相交的第%d个九宫的公共区域是本行有且只有可能填%d的区域,由此数%d不可能在[%c,%d]\n",i+'A'-1,m/3+1,j,j,k+'A'-1,l);
                        inc(flag);
                    end
                    end
                end
                end
               
#ifdef user
                if(flag) return flag;
                #endif
            
end
            
if(r[0][j]==s[2][(i-1)/3*3+(m)/3+1][j] && r[0][j]!=0 && r[0][j]!=s[0][i][j])
            begin
               
for(k=1;k<10;inc(k))
                begin
               
if(k<=m || k>m+3)
                begin
                    
if(x[i][k].ok[j])
                    begin
                    
x[i][k].ok[j]=0;
                    dec(x[i][k].left);
                    write("由于%c行与同本行相交的第%d个九宫的公共区域是此九宫中有且只有可能填%d的区域,由此数%d不可能在[%c,%d]\n",i+'A'-1,m/3+1,j,j,i+'A'-1,k);
                    inc(flag);
                    end
                end
                end
               
#ifdef user
                if(flag) return flag;
                #endif
            
end  
            
if(r[1][j]==s[1][i][j] && r[1][j]!=0 && r[1][j]!=s[2][(m)/3*3+(i-1)/3+1][j])
            begin
               
for(k=(i-1)/3*3+1;k<(i-1)/3*3+4;inc(k))
                begin
               
for(l=1+m;l<4+m;inc(l))
                begin
                    
if(k!=i)
                    begin
                    
if(x[l][k].ok[j])
                    begin
                        
x[l][k].ok[j]=0;
                        dec(x[l][k].left);
                        write("由于%d列与同本列相交的第%d个九宫的公共区域是本列有且仅有可能填%d的区域,由此数%d不可能在[%c,%d]\n",i,m/3+1,j,j,l+'A'-1,k);
                        inc(flag);
                    end
                    end
                end
                end
               
#ifdef user
                if(flag) return flag;
                #endif
            
end
            
if(r[1][j]==s[2][(m)/3*3+(i-1)/3+1][j] && r[1][j]!=0 && r[1][j]!=s[1][i][j])
            begin
               
for(k=1;k<10;inc(k))
                begin
               
if(k<=m || k>m+3)
                begin
                    
if(x[k][i].ok[j])
                    begin
                    
x[k][i].ok[j]=0;
                    dec(x[k][i].left);
                    write("由于%d列与同本列相交的第%d个九宫的公共区域是此九宫中有且仅有可能填%d的区域,由此数%d不可能在[%c,%d]\n",i,m/3+1,j,j,k+'A'-1,i);
                    inc(flag);
                    end
                end
                end
               
#ifdef user
                if(flag) return flag;
                #endif
            
end
        end
        end
    end
   
for(i=1;i<10;inc(i))
    begin
        
for(j=1;j<10;inc(j))
        begin
        
if(x[i][j].left==1)
        begin
               
for(k=1;k<10;inc(k)) if(x[i][j].ok[k]) break;
                x[i][j].num=k;
                inc(flag); work(i,j);
                write("在[%c,%d]中只能填%d\n",i+'A'-1,j,k);
                #ifdef user
                if(flag) return flag;
                #endif
        
end
        
else
        
begin
               
for(k=1;k<10;inc(k))
                begin
               
list[0]=s[0][i][k];
                list[1]=s[1][j][k];
                list[2]=s[2][(i-1)/3*3+(j-1)/3+1][k];
                for(l=0;l<3;inc(l))
                    if(list[l]==1 && x[i][j].ok[k])
                    begin
                    
fillchar(x[i][j].ok,0,sizeof(x[i][j].ok));
                    x[i][j].num=k; x[i][j].ok[k]=-1;
                    inc(flag); work(i,j);
                    write("在[%c,%d]所在的%s仅可填 %d\n",i+'A'-1,j,l==0 ? "行" : l==1 ? "列" : "九宫",k);
                    #ifdef user
                    if(flag) return flag;
                    #endif
                    
goto next;
                    end
                end
        end
        
next: ;
        end
    end
   
return flag;
end
integer can(integer a,integer b)
begin
   
integer i,j;
    integer ta,tb;
    ta=(a-1)/3*3;
    tb=(b-1)/3*3;
    for(i=1;i<10;inc(i))
    begin
        
if(x[i][b].num==x[a][b].num && i!=a) return 0;
        if(x[a][i].num==x[a][b].num && i!=b) return 0;
    end
   
for(i=ta+1;i<ta+4;inc(i))
        for(j=tb+1;j<tb+4;inc(j))
        if(x[i][j].num==x[a][b].num && !(i==a && j==b)) return 0;
    return 1;
end
integer dfs(integer a,integer b)
begin
   
integer i,j,t;
    if(a==10)
    begin
        
return 1;
    end
   
if(!x[a][b].num)
    begin
        
for(i=1;i<10;inc(i))
        begin
        
if(x[a][b].ok[i])
        begin
            
x[a][b].num=i;
            if(can(a,b))
            begin
            
if(dfs(a+b/9,b%9+1))
            begin
               
return 1;
            end
            end
            
x[a][b].num=0;
        end
        end
    end
   
else
        if
(dfs(a+b/9,b%9+1)) return 1;
    return 0;
end         
void output(integer ok,integer s_ok,integer black)
begin
   
integer i,j,k,l;
    char number[10][3]=begin "0","1","2","3","4","5","6","7","8","9"end ;
    if(black)
    begin
        
for(i=0;i<20;inc(i))
        begin
        
write("\n");
        end
    end
   
write("      ");
    for(j=1;j<10;inc(j))
        write("%d       ",j);
    write("\n\n");
    for(i=1;i<10;inc(i))
    begin
        
write("%c     ",'A'+i-1);
        for(j=1;j<10;inc(j))
        write("%s      ",number[x[i][j].num]);
        write("\n");
        /*输出可能情况*/
        
if(ok)
        begin
        
write("      ");
        for(j=1;j<10;inc(j))
        begin
            
l=0;
            for(k=1;k<10;inc(k))
            if(x[i][j].ok[k])
            begin
            
write("%d",k);
            inc(l);
            end
            
for(k=0;k<8-l;inc(k)) write(" ");
        end
        
write("\n\n");
        end
    end
   
if(s_ok)
    begin
        
for(i=0;i<3;inc(i))
        begin
            
write("s[%d]:\n",i);
            for(j=1;j<10;inc(j))
            begin
            
for(k=1;k<10;inc(k)) write("%d ",s[i][j][k]);
            write("\n");
            end
        end
    end
end
integer main(void)
begin
   
integer i,j,k,l;
    longint runtime,flag;
    fillchar(x,0,sizeof(x));
    for(i=1;i<10;inc(i))
    begin
        
for(j=1;j<10;inc(j))
        begin
        
read("%1d",&x[i][j].num);
        if(!x[i][j].num)
            fillchar(x[i][j].ok,-1,sizeof(x[i][j].ok));
        end
    end
   
runtime=clock();
    for(i=1;i<10;inc(i))
        for(j=1;j<10;inc(j)) work(i,j);
    for(i=1;i<10;inc(i))
        for(j=1;j<10;inc(j))
        begin
        
x[i][j].left=0;
        for(l=1;l<10;inc(l))
            if(x[i][j].ok[l]) inc(x[i][j].left);
        end
   
do
   
begin
        
#ifdef user
        getch();
        output(1,0,1);
        #endif
        
cuts();
    end while(search());
    /*=================================*/
    /*输出部分*/
   
write("结束\n");
    flag=1;
    for(i=1;i<10;inc(i))
        for(j=1;j<10;inc(j))
        if(!x[i][j].num) begin  flag=0; break; end
   
write("推理解答%s\n",flag ? "成功" : "失败");
    if(!flag)
    begin
            
write("继推理后进行搜索解答\n");
            if(dfs(1,1)) write("搜索解答成功\n");
            else write("搜索解答失败\n");
    end
   
output(0,0,0);
    runtime=clock()-runtime;
    write("Total time: %dms\n",runtime);
    /*=================================*/
   
while(1);
    return 0;
end


[[it] 本帖最后由 卧龙孔明 于 2008-6-4 12:23 编辑 [/it]]

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-06-04 12:20
快速回复:求200行代码的C题目
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059379 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved