0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

crossing.c

Last updated at Posted at 2013-09-17

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord14crosscircle/

他の解答例はこちら
http://qiita.com/Nabetani/items/66806c9dc14a96f2fd42

*** aabbca1bcbのときを例に解説 ***
<概要>
このコードは、円周上に並んだ点aabbca1bcbに1本ずつ線を引いていき、
その線を引いた時に交差した線の本数を積算しています。

<流れ>
最初は、円周上にaabbca1bcbと点が並んでいるだけで、線は一本も引かれていない状態です。

まず先頭のaから線を引きます。2番目のaと6番目のaに線が1本ずつ引けるので、それぞれのLineCntをカウントアップします。この2本の線を引いたときには1本も線を交差しないので、交点の数pは0のまま。

次に2番目のaから線を引きます。6番目のaに線が1本引けるので、6番目のaLineCntをカウントアップします。この線を引いた時も1本も線を交差しないので、交点の数pは0のまま。

次に3番目のbから線を引きます。4番目、8番目、10番目のbに線が引けるので、それぞれのLineCntをカウントアップします。8番目と10番目の線を引くときに、6番目のaの線2本と交差するので、pは4となります。

この作業を最後の文字まで繰り返せば、すべての交点の数を数えることができます。

#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int c[100];
} LineCnt;

int solve(const char *in)
{
	LineCnt l={0}, t={0};
	int i, j, p=0, tp=0;

	for(i=0; in[i]!='\0'; i++, l=t, tp=0) {
		for(j=i+1; in[j]!='\0'; j++) {
			if(in[j]==in[i]) {
				t.c[j]++;
				p+=tp;
			}
			tp += l.c[j];
		}
	}
	return p;
}

void test(const char *in, const char *a)
{
	int r = solve(in);
	printf("%d\t%s\n", r, (r==atoi(a)) ? "ok": "***NG***");
}

int main()
{
/*0*/ test( "aabbca1bcb", "14" );    
/*1*/ test( "111ZZZ", "0" );    
/*2*/ test( "v", "0" );    
/*3*/ test( "ww", "0" );    
/*4*/ test( "xxx", "0" );    
/*5*/ test( "yyyy", "1" );    
/*6*/ test( "zzzzz", "5" );    
/*7*/ test( "abcdef", "0" );    
/*8*/ test( "abcaef", "0" );    
/*9*/ test( "abbaee", "0" );    
/*10*/ test( "abcacb", "2" );    
/*11*/ test( "abcabc", "3" );    
/*12*/ test( "abcdabcd", "6" );    
/*13*/ test( "abcadeabcade", "23" );    
/*14*/ test( "abcdeedcba", "0" );    
/*15*/ test( "abcdeaedcba", "8" );    
/*16*/ test( "abcdeaedcbad", "16" );    
/*17*/ test( "QQQQXXXX", "2" );    
/*18*/ test( "QwQQmQXmXXwX", "14" );    
/*19*/ test( "111222333", "0" );    
/*20*/ test( "aaAAaA", "4" );    
/*21*/ test( "121232313", "12" );    
/*22*/ test( "1ab1b", "1" );    
/*23*/ test( "abcdefbadcfe", "12" );    
/*24*/ test( "abxcdefbadcfex", "14" );    
/*25*/ test( "dtnwtkt", "0" );    
/*26*/ test( "mvubvpp", "0" );    
/*27*/ test( "moggscd", "0" );    
/*28*/ test( "kzkjzpkw", "2" );    
/*29*/ test( "fbifybre", "1" );    
/*30*/ test( "rrrfjryki", "1" );    
/*31*/ test( "wrbbdwsdwtx", "2" );    
/*32*/ test( "vvucugvxbvgx", "9" );    
/*33*/ test( "ojkjzyasjwbfjj", "5" );    
/*34*/ test( "ggffyuxnkyypifff", "5" );    
/*35*/ test( "vcgtcqlwrepwvkkogl", "4" );    
/*36*/ test( "xeqtmmgppwcjpcisogxbs", "4" );    
/*37*/ test( "lukltpeucrqfvcupnpxwmoj", "6" );    
/*38*/ test( "zpzswlkkoqwwndwpfdpkhtzgtn", "31" );    
/*39*/ test( "bkfeflagfvluelududqjcvfyvytfw", "45" );    
/*40*/ test( "rvqbhfmcjjqlpqzulzerxgyowiwrfkmhw", "26" );    
/*41*/ test( "qyxvpdtoeexbqsethwjwmqszcxxjnsdoeaet", "144" );    
/*42*/ test( "rjmsgmswhcolmpbhmpncziymydyalrcnevsrespj", "133" );    
/*43*/ test( "oxetnyjzjbysnwktfwzndlejfndsqeetsnjvsicyjehd", "395" );    
/*44*/ test( "wzvddnddzogywcqxbyvagbzmsmtcmrrlbnebmvhaemjouaqim", "219" );    
/*45*/ test( "karhphxcxqgsyorhusbumbqzocuzvnwzwcpxgsksrviihxrgsrhji", "461" );    
/*46*/ test( "oxgbononhqdxzmkysgijwvxljpaazmgkurkpffeuwywwuyxhyfkicgyzyc", "441" );    
/*47*/ test( "sdgsrddwsrwqthhdvhrjhgtxwgurgyiygtktgtughtogzaqmcafkljgpniddsvb", "1077" );    
/*48*/ test( "qemhecchkgzhxmdcsltwhpoyhkapckkkzosmklcvzkiiucrvzzznmhjfcdumuflavxik", "1711" );    
/*49*/ test( "ffqmsirwpxrzfkbvmmfeptkbhnrvfcywthkwkbycmayhhkgvuyecbwwofwthlmzruphrcujwhr", "2440" );
	return 0;
}
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?